diff --git a/.babelrc b/.babelrc new file mode 100644 index 0000000000000000000000000000000000000000..d8f61d776f247c80c38eefd04fc2af1423b08d62 --- /dev/null +++ b/.babelrc @@ -0,0 +1,12 @@ +{ + "plugins": [ + "@babel/plugin-syntax-dynamic-import", + "@babel/plugin-proposal-object-rest-spread", + ["react-intl", { + "messagesDir": "./translations/messages/" + }]], + "presets": [ + ["@babel/preset-env"], + "@babel/preset-react" + ] +} diff --git a/.browserslistrc b/.browserslistrc new file mode 100644 index 0000000000000000000000000000000000000000..1346d529ab829b2746617fcb2ae83cefabbc3189 --- /dev/null +++ b/.browserslistrc @@ -0,0 +1,6 @@ +chrome >= 70 +chromeandroid >= 70 +ios >= 12 +safari >= 12 +edge >= 18 +firefox >= 68 \ No newline at end of file diff --git a/.circleci/config.yml b/.circleci/config.yml new file mode 100644 index 0000000000000000000000000000000000000000..46b5327ed20cd3a97dfb940e79bd3a8a22759fe1 --- /dev/null +++ b/.circleci/config.yml @@ -0,0 +1,329 @@ +version: 2.1 +orbs: + browser-tools: circleci/browser-tools@1.2.4 +aliases: + - &save_git_cache + save_cache: + paths: + - .git + key: v3-git-{{ .Revision }} + - &restore_git_cache + restore_cache: + keys: + - v3-git-{{ .Revision }} + - v3-git- + - &save_build_cache + save_cache: + paths: + - build + key: v3-build-{{ .Revision }} + - &restore_build_cache + restore_cache: + keys: + - v3-build-{{ .Revision }} + - &save_dist_cache + save_cache: + paths: + - dist + key: v3-dist-{{ .Revision }} + - &restore_dist_cache + restore_cache: + keys: + - v3-dist-{{ .Revision }} + - &save_npm_cache + save_cache: + paths: + - node_modules + key: v3-npm-{{ checksum "package-lock.json" }} + - &restore_npm_cache + restore_cache: + keys: + - v3-npm-{{ checksum "package-lock.json" }} + - v3-npm- + - &defaults + docker: + - image: cimg/node:12.22.11-browsers + auth: + username: $DOCKERHUB_USERNAME + password: $DOCKERHUB_PASSWORD + working_directory: ~/repo + +jobs: + build-test-no-cache: + <<: *defaults + environment: + JEST_JUNIT_OUTPUT_DIR: test-results + NODE_OPTIONS: --max-old-space-size=4000 + steps: + - *restore_git_cache + - checkout + - run: npm ci + - run: + name: Lint + command: npm run test:lint -- --quiet --output-file test-results/eslint-results.xml --format junit + - run: + name: Unit + environment: + JEST_JUNIT_OUTPUT_NAME: unit-results.xml + command: npm run test:unit -- --reporters="default" --reporters="jest-junit" --coverage --coverageReporters=text --coverageReporters=lcov --maxWorkers="2" + - run: + name: Build + environment: + NODE_ENV: production + command: npm run build + - browser-tools/install-chrome + - browser-tools/install-chromedriver + - run: + name: Integration + environment: + JEST_JUNIT_OUTPUT_NAME: integration-results.xml + command: | + google-chrome --version + chromedriver --version + npm run test:integration -- --reporters="default" --reporters="jest-junit" + - store_artifacts: + path: coverage + - store_test_results: + path: test-results + setup: + <<: *defaults + steps: + - *restore_git_cache + - checkout + - run: npm ci + - *save_git_cache + - *save_npm_cache + lint: + <<: *defaults + steps: + - *restore_git_cache + - checkout + - *restore_npm_cache + - run: + name: Lint + command: npm run test:lint -- --quiet --output-file test-results/eslint/results.xml --format junit + - store_test_results: + path: test-results + unit: + <<: *defaults + environment: + JEST_JUNIT_OUTPUT_NAME: results.xml + steps: + - *restore_git_cache + - checkout + - *restore_npm_cache + - run: + name: Unit + environment: + JEST_JUNIT_OUTPUT_DIR: test-results/unit + command: npm run test:unit -- --reporters="default" --reporters="jest-junit" --coverage --coverageReporters=text --coverageReporters=lcov --maxWorkers="2" + - store_artifacts: + path: coverage + - store_test_results: + path: test-results + build: + <<: *defaults + environment: + NODE_ENV: production + NODE_OPTIONS: --max-old-space-size=4000 + steps: + - *restore_git_cache + - checkout + - *restore_npm_cache + - run: + name: Build + command: npm run build + - *save_build_cache + - *save_dist_cache + store_build: + <<: *defaults + steps: + - *restore_build_cache + - store_artifacts: + path: build + store_dist: + <<: *defaults + steps: + - *restore_dist_cache + - store_artifacts: + path: dist + integration: + <<: *defaults + parallelism: 2 + environment: + JEST_JUNIT_OUTPUT_NAME: results.txt + steps: + - *restore_git_cache + - checkout + - *restore_npm_cache + - *restore_build_cache + - browser-tools/install-chrome + - browser-tools/install-chromedriver + - run: + name: Integration + environment: + JEST_JUNIT_OUTPUT_DIR: test-results/integration + command: | + google-chrome --version + chromedriver --version + export TESTFILES=$(circleci tests glob "test/integration/*.test.js" | circleci tests split --split-by=timings) + $(npm bin)/jest ${TESTFILES} --reporters="default" --reporters="jest-junit" --runInBand + - store_test_results: + path: test-results + + deploy-npm: + <<: *defaults + environment: + NODE_OPTIONS: --max-old-space-size=4000 + steps: + - *restore_git_cache + - *restore_dist_cache + - checkout + - run: | + echo export RELEASE_VERSION="0.1.0-prerelease.$(date +'%Y%m%d%H%M%S')" >> $BASH_ENV + echo export NPM_TAG=latest >> $BASH_ENV + if [ "$CIRCLE_BRANCH" == "master" ] + then echo export NPM_TAG=stable >> $BASH_ENV + fi + if [[ "$CIRCLE_BRANCH" == hotfix/* ]] # double brackets are important for matching the wildcard + then echo export NPM_TAG=hotfix >> $BASH_ENV + fi + - run: npm version --no-git-tag-version $RELEASE_VERSION + - run: | + npm set //registry.npmjs.org/:_authToken=$NPM_TOKEN + npm publish --tag $NPM_TAG + - run: git tag $RELEASE_VERSION + - run: git push $CIRCLE_REPOSITORY_URL $RELEASE_VERSION + + deploy-gh-pages: + <<: *defaults + steps: + - *restore_git_cache + - checkout + - *restore_npm_cache + - *restore_build_cache + - run: | + git config --global user.email $(git log --pretty=format:"%ae" -n1) + git config --global user.name $(git log --pretty=format:"%an" -n1) + - run: npm run deploy -- -e $CIRCLE_BRANCH + push-translations: + <<: *defaults + steps: + - *restore_git_cache + - checkout + - *restore_npm_cache + - run: npm run i18n:src + - run: npm run i18n:push + +workflows: + version: 2 + push-translations: + triggers: + - schedule: + cron: 0 0 * * * # daily at 12 UTC, 8 ET + filters: + branches: + only: + - develop + jobs: + - setup: + context: + - dockerhub-credentials + - push-translations: + context: + - dockerhub-credentials + requires: + - setup + + build-test-no-deploy: + jobs: + - build-test-no-cache: + context: + - dockerhub-credentials + filters: + branches: + ignore: + - master + - develop + - /^hotfix\/.*/ + build-test-deploy: + jobs: + - setup: + context: + - dockerhub-credentials + filters: + branches: + only: + - master + - develop + - /^hotfix\/.*/ + - lint: + context: + - dockerhub-credentials + requires: + - setup + - unit: + context: + - dockerhub-credentials + requires: + - setup + - build: + context: + - dockerhub-credentials + requires: + - setup + - integration: + context: + - dockerhub-credentials + requires: + - build + - store_build: + context: + - dockerhub-credentials + requires: + - build + filters: + branches: + only: + - master + - develop + - /^hotfix\/.*/ + - store_dist: + context: + - dockerhub-credentials + requires: + - build + filters: + branches: + only: + - master + - develop + - /^hotfix\/.*/ + - deploy-npm: + context: + - dockerhub-credentials + requires: + - lint + - unit + - integration + - build + filters: + branches: + only: + - master + - develop + - /^hotfix\/.*/ + - deploy-gh-pages: + context: + - dockerhub-credentials + requires: + - lint + - unit + - integration + - build + filters: + branches: + ignore: + - /^dependabot/.*/ + - /^renovate/.*/ + - /^pull/.*/ # don't deploy to gh pages on PRs. diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000000000000000000000000000000000000..e84613dd6c76b1f75668c71b96f56ed141f05b2d --- /dev/null +++ b/.editorconfig @@ -0,0 +1,11 @@ +root = true + +[*] +end_of_line = lf +insert_final_newline = true +charset = utf-8 +indent_size = 4 +trim_trailing_whitespace = true + +[*.{js,html}] +indent_style = space diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 0000000000000000000000000000000000000000..96911dcc5cd32501832c418315afb8f2d4a98957 --- /dev/null +++ b/.eslintignore @@ -0,0 +1,8 @@ +node_modules/* +!build/* +!dist/* +# Files imported from upstream +!src/addons/addons +!src/addons/libraries +!src/addons/api-libraries +!src/addons/generated diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 0000000000000000000000000000000000000000..36ff570d9d3cd8f10285c343b34168c18fccfe16 --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,3 @@ +module.exports = { + extends: ['scratch', 'scratch/node'] +}; diff --git a/.gitattributes b/.gitattributes index a6344aac8c09253b3b630fb776ae94478aa0275b..cd1db81aaab248f14c2f5e584ede534cba73accb 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,35 +1,147 @@ -*.7z filter=lfs diff=lfs merge=lfs -text -*.arrow filter=lfs diff=lfs merge=lfs -text -*.bin filter=lfs diff=lfs merge=lfs -text -*.bz2 filter=lfs diff=lfs merge=lfs -text -*.ckpt filter=lfs diff=lfs merge=lfs -text -*.ftz filter=lfs diff=lfs merge=lfs -text -*.gz filter=lfs diff=lfs merge=lfs -text -*.h5 filter=lfs diff=lfs merge=lfs -text -*.joblib filter=lfs diff=lfs merge=lfs -text -*.lfs.* filter=lfs diff=lfs merge=lfs -text -*.mlmodel filter=lfs diff=lfs merge=lfs -text -*.model filter=lfs diff=lfs merge=lfs -text -*.msgpack filter=lfs diff=lfs merge=lfs -text -*.npy filter=lfs diff=lfs merge=lfs -text -*.npz filter=lfs diff=lfs merge=lfs -text -*.onnx filter=lfs diff=lfs merge=lfs -text -*.ot filter=lfs diff=lfs merge=lfs -text -*.parquet filter=lfs diff=lfs merge=lfs -text -*.pb filter=lfs diff=lfs merge=lfs -text -*.pickle filter=lfs diff=lfs merge=lfs -text -*.pkl filter=lfs diff=lfs merge=lfs -text -*.pt filter=lfs diff=lfs merge=lfs -text -*.pth filter=lfs diff=lfs merge=lfs -text -*.rar filter=lfs diff=lfs merge=lfs -text -*.safetensors filter=lfs diff=lfs merge=lfs -text -saved_model/**/* filter=lfs diff=lfs merge=lfs -text -*.tar.* filter=lfs diff=lfs merge=lfs -text -*.tar filter=lfs diff=lfs merge=lfs -text -*.tflite filter=lfs diff=lfs merge=lfs -text -*.tgz filter=lfs diff=lfs merge=lfs -text -*.wasm filter=lfs diff=lfs merge=lfs -text -*.xz filter=lfs diff=lfs merge=lfs -text -*.zip filter=lfs diff=lfs merge=lfs -text -*.zst filter=lfs diff=lfs merge=lfs -text -*tfevents* filter=lfs diff=lfs merge=lfs -text +# Set the default behavior, in case people don't have core.autocrlf set. +* text=auto + +# Explicitly specify line endings for as many files as possible. +# People who (for example) rsync between Windows and Linux need this. + +# File types which we know are binary + +# Treat SVG files as binary so that their contents don't change due to line +# endings. The contents of SVGs must not change from the way they're stored +# on assets.scratch.mit.edu so that MD5 calculations don't change. +*.svg binary + +# Prefer LF for most file types +*.css text eol=lf +*.frag text eol=lf +*.htm text eol=lf +*.html text eol=lf +*.iml text eol=lf +*.js text eol=lf +*.js.map text eol=lf +*.json text eol=lf +*.json5 text eol=lf +*.jsx text eol=lf +*.md text eol=lf +*.vert text eol=lf +*.xml text eol=lf +*.yml text eol=lf + +# Prefer LF for these files +.editorconfig text eol=lf +.eslintrc text eol=lf +.gitattributes text eol=lf +.gitignore text eol=lf +.gitmodules text eol=lf +LICENSE text eol=lf +Makefile text eol=lf +README text eol=lf +TRADEMARK text eol=lf + +# Use CRLF for Windows-specific file types +src/lib/libraries/decks/steps/add-variable.pt_BR.gif filter=lfs diff=lfs merge=lfs -text +src/lib/libraries/decks/steps/animate-char-pick-sprite.LTR.gif filter=lfs diff=lfs merge=lfs -text +src/lib/libraries/decks/steps/chase-game-add-backdrop.LTR.gif filter=lfs diff=lfs merge=lfs -text +src/lib/libraries/decks/steps/chase-game-add-sprite1.LTR.gif filter=lfs diff=lfs merge=lfs -text +src/lib/libraries/decks/steps/chase-game-add-sprite2.LTR.gif filter=lfs diff=lfs merge=lfs -text +src/lib/libraries/decks/steps/cn-show-character.LTR.gif filter=lfs diff=lfs merge=lfs -text +src/lib/libraries/decks/steps/code-cartoon-04-use-minus-sign.es.png filter=lfs diff=lfs merge=lfs -text +src/lib/libraries/decks/steps/code-cartoon-04-use-minus-sign.tr.png filter=lfs diff=lfs merge=lfs -text +src/lib/libraries/decks/steps/fly-choose-backdrop.LTR.gif filter=lfs diff=lfs merge=lfs -text +src/lib/libraries/decks/steps/fly-choose-scenery.LTR.gif filter=lfs diff=lfs merge=lfs -text +src/lib/libraries/decks/steps/glide-around-point.es.png filter=lfs diff=lfs merge=lfs -text +src/lib/libraries/decks/steps/imagine-record-a-sound.am.gif filter=lfs diff=lfs merge=lfs -text +src/lib/libraries/decks/steps/imagine-record-a-sound.en.gif filter=lfs diff=lfs merge=lfs -text +src/lib/libraries/decks/steps/imagine-record-a-sound.es.gif filter=lfs diff=lfs merge=lfs -text +src/lib/libraries/decks/steps/imagine-record-a-sound.fr.gif filter=lfs diff=lfs merge=lfs -text +src/lib/libraries/decks/steps/imagine-record-a-sound.ja.gif filter=lfs diff=lfs merge=lfs -text +src/lib/libraries/decks/steps/imagine-record-a-sound.pt_BR.gif filter=lfs diff=lfs merge=lfs -text +src/lib/libraries/decks/steps/imagine-record-a-sound.sw.gif filter=lfs diff=lfs merge=lfs -text +src/lib/libraries/decks/steps/imagine-record-a-sound.tr.gif filter=lfs diff=lfs merge=lfs -text +src/lib/libraries/decks/steps/imagine-record-a-sound.uk.gif filter=lfs diff=lfs merge=lfs -text +src/lib/libraries/decks/steps/imagine-record-a-sound.zh_CN.gif filter=lfs diff=lfs merge=lfs -text +src/lib/libraries/decks/steps/imagine-record-a-sound.zh_TW.gif filter=lfs diff=lfs merge=lfs -text +src/lib/libraries/decks/steps/imagine-record-a-sound.zu.gif filter=lfs diff=lfs merge=lfs -text +src/lib/libraries/decks/steps/intro-1-move.es.gif filter=lfs diff=lfs merge=lfs -text +src/lib/libraries/decks/steps/intro-1-move.zu.gif filter=lfs diff=lfs merge=lfs -text +src/lib/libraries/decks/steps/intro-2-say.fr.gif filter=lfs diff=lfs merge=lfs -text +src/lib/libraries/decks/steps/intro-2-say.zh_TW.gif filter=lfs diff=lfs merge=lfs -text +src/lib/libraries/decks/steps/intro-3-green-flag.es.gif filter=lfs diff=lfs merge=lfs -text +src/lib/libraries/decks/steps/intro-3-green-flag.fr.gif filter=lfs diff=lfs merge=lfs -text +src/lib/libraries/decks/steps/intro-3-green-flag.ja.gif filter=lfs diff=lfs merge=lfs -text +src/lib/libraries/decks/steps/intro-3-green-flag.pt_BR.gif filter=lfs diff=lfs merge=lfs -text +src/lib/libraries/decks/steps/intro-3-green-flag.sw.gif filter=lfs diff=lfs merge=lfs -text +src/lib/libraries/decks/steps/intro-3-green-flag.tr.gif filter=lfs diff=lfs merge=lfs -text +src/lib/libraries/decks/steps/intro-3-green-flag.zh_CN.gif filter=lfs diff=lfs merge=lfs -text +src/lib/libraries/decks/steps/intro-3-green-flag.zh_TW.gif filter=lfs diff=lfs merge=lfs -text +src/lib/libraries/decks/steps/music-pick-instrument.LTR.gif filter=lfs diff=lfs merge=lfs -text +src/lib/libraries/decks/steps/name-pick-letter2.LTR.gif filter=lfs diff=lfs merge=lfs -text +src/lib/libraries/decks/steps/pong-add-a-paddle.LTR.gif filter=lfs diff=lfs merge=lfs -text +src/lib/libraries/decks/steps/pong-add-line.LTR.gif filter=lfs diff=lfs merge=lfs -text +src/lib/libraries/decks/steps/pong-add-line.RTL.gif filter=lfs diff=lfs merge=lfs -text +src/lib/libraries/decks/steps/speech-add-sprite.LTR.gif filter=lfs diff=lfs merge=lfs -text +src/lib/libraries/decks/steps/speech-spin.am.png filter=lfs diff=lfs merge=lfs -text +src/lib/libraries/decks/steps/speech-spin.ar.png filter=lfs diff=lfs merge=lfs -text +src/lib/libraries/decks/steps/speech-spin.en.png filter=lfs diff=lfs merge=lfs -text +src/lib/libraries/decks/steps/speech-spin.fr.png filter=lfs diff=lfs merge=lfs -text +src/lib/libraries/decks/steps/speech-spin.ja.png filter=lfs diff=lfs merge=lfs -text +src/lib/libraries/decks/steps/speech-spin.pt_BR.png filter=lfs diff=lfs merge=lfs -text +src/lib/libraries/decks/steps/speech-spin.sw.png filter=lfs diff=lfs merge=lfs -text +src/lib/libraries/decks/steps/speech-spin.tr.png filter=lfs diff=lfs merge=lfs -text +src/lib/libraries/decks/steps/speech-spin.uk.png filter=lfs diff=lfs merge=lfs -text +src/lib/libraries/decks/steps/speech-spin.zh_CN.png filter=lfs diff=lfs merge=lfs -text +src/lib/libraries/decks/steps/speech-spin.zh_TW.png filter=lfs diff=lfs merge=lfs -text +src/lib/libraries/decks/steps/speech-spin.zu.png filter=lfs diff=lfs merge=lfs -text +src/lib/libraries/decks/steps/story-flip.en.gif filter=lfs diff=lfs merge=lfs -text +src/lib/libraries/decks/steps/story-flip.pt_BR.gif filter=lfs diff=lfs merge=lfs -text +src/lib/libraries/decks/steps/story-pick-backdrop.LTR.gif filter=lfs diff=lfs merge=lfs -text +src/lib/libraries/decks/steps/story-pick-backdrop2.LTR.gif filter=lfs diff=lfs merge=lfs -text +src/lib/libraries/decks/steps/story-pick-sprite.LTR.gif filter=lfs diff=lfs merge=lfs -text +src/lib/libraries/decks/steps/story-pick-sprite2.LTR.gif filter=lfs diff=lfs merge=lfs -text +src/lib/libraries/decks/steps/talking-11-choose-sound.am.gif filter=lfs diff=lfs merge=lfs -text +src/lib/libraries/decks/steps/talking-11-choose-sound.en.gif filter=lfs diff=lfs merge=lfs -text +src/lib/libraries/decks/steps/talking-11-choose-sound.es.gif filter=lfs diff=lfs merge=lfs -text +src/lib/libraries/decks/steps/talking-11-choose-sound.fr.gif filter=lfs diff=lfs merge=lfs -text +src/lib/libraries/decks/steps/talking-11-choose-sound.ja.gif filter=lfs diff=lfs merge=lfs -text +src/lib/libraries/decks/steps/talking-11-choose-sound.pt_BR.gif filter=lfs diff=lfs merge=lfs -text +src/lib/libraries/decks/steps/talking-11-choose-sound.sw.gif filter=lfs diff=lfs merge=lfs -text +src/lib/libraries/decks/steps/talking-11-choose-sound.tr.gif filter=lfs diff=lfs merge=lfs -text +src/lib/libraries/decks/steps/talking-11-choose-sound.zh_CN.gif filter=lfs diff=lfs merge=lfs -text +src/lib/libraries/decks/steps/talking-11-choose-sound.zh_TW.gif filter=lfs diff=lfs merge=lfs -text +src/lib/libraries/decks/steps/talking-11-choose-sound.zu.gif filter=lfs diff=lfs merge=lfs -text +src/lib/libraries/decks/thumbnails/add-backdrop.jpg filter=lfs diff=lfs merge=lfs -text +src/lib/libraries/decks/thumbnails/add-effects.jpg filter=lfs diff=lfs merge=lfs -text +src/lib/libraries/decks/thumbnails/add-sprite.jpg filter=lfs diff=lfs merge=lfs -text +src/lib/libraries/decks/thumbnails/animate-a-character.jpg filter=lfs diff=lfs merge=lfs -text +src/lib/libraries/decks/thumbnails/animate-a-name.jpg filter=lfs diff=lfs merge=lfs -text +src/lib/libraries/decks/thumbnails/animate-sprite.jpg filter=lfs diff=lfs merge=lfs -text +src/lib/libraries/decks/thumbnails/cartoon-network.jpg filter=lfs diff=lfs merge=lfs -text +src/lib/libraries/decks/thumbnails/change-size.jpg filter=lfs diff=lfs merge=lfs -text +src/lib/libraries/decks/thumbnails/chase-game.jpg filter=lfs diff=lfs merge=lfs -text +src/lib/libraries/decks/thumbnails/code-a-cartoon.jpg filter=lfs diff=lfs merge=lfs -text +src/lib/libraries/decks/thumbnails/getting-started-asl.png filter=lfs diff=lfs merge=lfs -text +src/lib/libraries/decks/thumbnails/getting-started.jpg filter=lfs diff=lfs merge=lfs -text +src/lib/libraries/decks/thumbnails/glide-around.jpg filter=lfs diff=lfs merge=lfs -text +src/lib/libraries/decks/thumbnails/imagine.jpg filter=lfs diff=lfs merge=lfs -text +src/lib/libraries/decks/thumbnails/make-music.jpg filter=lfs diff=lfs merge=lfs -text +src/lib/libraries/decks/thumbnails/move-arrow-keys.jpg filter=lfs diff=lfs merge=lfs -text +src/lib/libraries/decks/thumbnails/record-a-sound.jpg filter=lfs diff=lfs merge=lfs -text +src/lib/libraries/decks/thumbnails/spin.jpg filter=lfs diff=lfs merge=lfs -text +src/lib/libraries/decks/thumbnails/tell-a-story.jpg filter=lfs diff=lfs merge=lfs -text +src/lib/libraries/decks/thumbnails/text-to-speech.jpg filter=lfs diff=lfs merge=lfs -text +src/lib/libraries/decks/thumbnails/video-sensing.jpg filter=lfs diff=lfs merge=lfs -text +src/lib/libraries/extensions/penguinmod/extensions/3d_physics_icon_layered.pdn filter=lfs diff=lfs merge=lfs -text +src/lib/libraries/extensions/penguinmod/extensions/lua.png filter=lfs diff=lfs merge=lfs -text +src/lib/libraries/extensions/penguinmod/extensions/mcutils.png filter=lfs diff=lfs merge=lfs -text +src/lib/libraries/extensions/penguinmod/extensions/text[[:space:]]extension.png filter=lfs diff=lfs merge=lfs -text +src/lib/tw-scratch-render-fonts/Archivo-Black.ttf filter=lfs diff=lfs merge=lfs -text +src/lib/tw-scratch-render-fonts/Archivo-Regular.ttf filter=lfs diff=lfs merge=lfs -text +src/lib/tw-scratch-render-fonts/BadComic-Regular.ttf filter=lfs diff=lfs merge=lfs -text +src/lib/tw-scratch-render-fonts/Griffy-Regular.ttf filter=lfs diff=lfs merge=lfs -text +src/lib/tw-scratch-render-fonts/Monospace.ttf filter=lfs diff=lfs merge=lfs -text +src/lib/tw-scratch-render-fonts/MonospaceBold.ttf filter=lfs diff=lfs merge=lfs -text +src/lib/tw-scratch-render-fonts/NotoSans-Medium.ttf filter=lfs diff=lfs merge=lfs -text +src/lib/tw-scratch-render-fonts/SourceSerifPro-Regular.otf filter=lfs diff=lfs merge=lfs -text +static/favicon.ico filter=lfs diff=lfs merge=lfs -text +static/images/favicon.ico filter=lfs diff=lfs merge=lfs -text +favicon.ico filter=lfs diff=lfs merge=lfs -text diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md new file mode 100644 index 0000000000000000000000000000000000000000..38756937c53bdddf1540acf4b81e6faf090a2240 --- /dev/null +++ b/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,15 @@ +### 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/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000000000000000000000000000000000000..9a75ac19a468a50b9a51d887cdd7fd9e3d369498 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,39 @@ +### Resolves + +_What Github issue does this resolve (please include link)?_ + +- Resolves # + +### 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_ + +### Browser Coverage +Check the OS/browser combinations tested (At least 2) + +Mac + * [ ] Chrome + * [ ] Firefox + * [ ] Safari + +Windows + * [ ] Chrome + * [ ] Firefox + * [ ] Edge + +Chromebook + * [ ] Chrome + +iPad +* [ ] Safari + +Android Tablet +* [ ] Chrome diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000000000000000000000000000000000000..028d1bc3117e9307eebe0ea3b484e4daf95d2d39 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,15 @@ +version: 2 +updates: + - package-ecosystem: "npm" + directory: "/" + schedule: + interval: "daily" + allow: + - dependency-name: "scratch-audio" + - dependency-name: "scratch-render" + - dependency-name: "scratch-vm" + - dependency-name: "scratch-paint" + - dependency-name: "scratch-svg-renderer" + - dependency-name: "scratch-blocks" + - dependency-name: "scratch-storage" + - dependency-name: "@turbowarp/scratch-l10n" diff --git a/.github/workflows/e.yml b/.github/workflows/e.yml new file mode 100644 index 0000000000000000000000000000000000000000..f92efd8874118a90725907ac6b86165031f20e51 --- /dev/null +++ b/.github/workflows/e.yml @@ -0,0 +1,31 @@ +# Thtttis workflow will do a clean installation of node dependencies, cache/restore them, build the source code and run tests across different versions of node +# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions + +name: Node.js CI + +on: + push: + branches: [ main ] + pull_request: + branches: [ main ] + +jobs: + build: + + runs-on: ubuntu-latest + + strategy: + matrix: + node-version: [12.x, 14.x, 16.x] + # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ + + steps: + - uses: actions/checkout@v2 + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v2 + with: + node-version: ${{ matrix.node-version }} + cache: 'npm' + - run: npm ci + - run: npm run build --if-present + - run: npm test diff --git a/.github/workflows/nextjs.yml b/.github/workflows/nextjs.yml new file mode 100644 index 0000000000000000000000000000000000000000..9cc91198f667a0e67fed94de9f1654ebdaa1a3b0 --- /dev/null +++ b/.github/workflows/nextjs.yml @@ -0,0 +1,31 @@ +# This workflow will do a clean installation of node dependencies, cache/restore them, build the source code and run tests across different versions of node +# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions + +name: Node.js CIeeee + +on: + push: + branches: [ main ] + pull_request: + branches: [ main ] + +jobs: + build: + + runs-on: ubuntu-latest + + strategy: + matrix: + node-version: [12.x, 14.x, 16.x] + # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ + + steps: + - uses: actions/checkout@v2 + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v2 + with: + node-version: ${{ matrix.node-version }} + cache: 'npm' + - run: npm ci + - run: npm run build --if-present + - run: npm test diff --git a/.github/workflows/node.js.yml b/.github/workflows/node.js.yml new file mode 100644 index 0000000000000000000000000000000000000000..cda16f80d38c2ad5db6e4794120ab62b2c7f38fb --- /dev/null +++ b/.github/workflows/node.js.yml @@ -0,0 +1,45 @@ +on: + workflow_dispatch: + repository_dispatch: + push: + +permissions: + contents: read + pages: write + id-token: write + +concurrency: + group: "deploy" + cancel-in-progress: true + #ci-${{ github.ref }} + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v3 + - name: Setup GitHub Pages + id: pages + uses: actions/configure-pages@v1 + - name: Install Node.js + uses: actions/setup-node@v3 + with: + node-version: 16.x + - name: Install dependencies and build site + run: npm i -g pnpm@v6 && pnpm up && pnpm i --shamefully-hoist --force && NODE_ENV=production webpack --bail + - name: Upload artifact + uses: actions/upload-pages-artifact@v3 + with: + path: ./build/ + + deploy: + environment: + name: github-pages + url: 'https://penguinmod.com/project' + runs-on: ubuntu-latest + needs: build + steps: + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v4 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..f56390aef662c49341d8f66acbe03c569dce1384 --- /dev/null +++ b/.gitignore @@ -0,0 +1,23 @@ +# Mac OS +.DS_Store +.deploy.js +# NPM +/node_modules +npm-* + +# Testing +/.nyc_output +/coverage + +# Build +/.opt-in +!build/ +!dist/ +build/* +yarn.lock + +# Generated translation files +/translations +/locale +src/lib/tw-translations/new-generated-translations.json +src/lib/tw-translations/merged-translations.json diff --git a/.gitpod.yml b/.gitpod.yml new file mode 100644 index 0000000000000000000000000000000000000000..e5b796388c5bbfbb701aad0ba7a12b1ca30b7d6e --- /dev/null +++ b/.gitpod.yml @@ -0,0 +1,8 @@ +tasks: + - name: Install and build + init: npm i -g pnpm && pnpm up && pnpm i --shamefully-hoist + command: npm run start + +ports: + - port: 3000 + onOpen: open-browser diff --git a/.npmignore b/.npmignore new file mode 100644 index 0000000000000000000000000000000000000000..8103b5644051c81871c5735b99ee6bff610fd32d --- /dev/null +++ b/.npmignore @@ -0,0 +1,16 @@ + +# NPM +/node_modules +npm-* + +# Testing +/.nyc_output +/coverage +/test + +# Build +/.opt-in +/build + +# generated translation files +/translations diff --git a/.npmrc b/.npmrc new file mode 100644 index 0000000000000000000000000000000000000000..d3f5a12faa99758192ecc4ed3fc22c9249232e86 --- /dev/null +++ b/.npmrc @@ -0,0 +1 @@ + diff --git a/.tx/config b/.tx/config new file mode 100644 index 0000000000000000000000000000000000000000..f73791ea98270ab34baa77dc0e0a610bd8f38d89 --- /dev/null +++ b/.tx/config @@ -0,0 +1,8 @@ +[main] +host = https://www.transifex.com + +[scratch-editor.interface] +file_filter = translations/.json +source_file = translations/en.json +source_lang = en +type = CHROME diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000000000000000000000000000000000000..fdb9569e461a3b1de087b0293713520d6bb14e3d --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,5 @@ +{ + "yaml.schemas": { + "https://gitpod.io/schemas/gitpod-schema.json": "file:///workspace/penguinmod.github.io/.gitpod.yml" + } +} \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000000000000000000000000000000000000..2b233fe6e010027a91b0a0e693a3138abba47a24 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,27 @@ +# ベースイメージとして Node.js を使用 +FROM node:20.18.1 + +# 作業ディレクトリを設定 +WORKDIR /app + +# ホストのファイルをコンテナにコピー +COPY . . +#RUN npm install -g pnpm +# translations ディレクトリを作成し、権限を設定 +RUN mkdir -p /app/translations && chmod -R 777 /app/translations +RUN chmod -R 777 /app + +# 依存関係をインストール(競合を無視) +#RUN PNPM_SKIP_BUILDS_APPROVAL=true pnpm install --prefer-offline --strict-peer-dependencies=false +RUN npm install --prefer-offline --no-audit --legacy-peer-deps + +# OpenSSL の互換オプションを有効化 +#ENV NODE_OPTIONS="--openssl-legacy-provider" + +#RUN PNPM_SKIP_BUILDS_APPROVAL=true pnpm install scratch-vm@git+https://huggingface.co/datasets/soiz1/s4s-vm +RUN npm install scratch-vm@git+https://huggingface.co/datasets/soiz1/s4s-vm +# コンテナの起動時にサーバーを実行 +CMD ["npm", "start"] + +# コンテナがリッスンするポート +EXPOSE 3000 \ No newline at end of file diff --git a/FORKING.md b/FORKING.md new file mode 100644 index 0000000000000000000000000000000000000000..7d45fe5eb4bcf267b37865694e5ea6e73db58b8b --- /dev/null +++ b/FORKING.md @@ -0,0 +1,24 @@ +This file contains instructions on what you should do upon forking PenguinMod. + +You don't HAVE to follow this document but it'll prevent a lot of confusion for your users and likely prevent your mod from being blacklisted from our internal servers. + +# Branding changes +Update any labels or text that says "PenguinMod" and put your mod's name. +You shouldn't do this for IDs or anything like that. + +You should also update your credits & privacy policy pages. Some contributors may not be ok with being listed as working on your mod directly. + +Update any links to our github to yours so people can find the source code. Also make sure to update links that you have your own version of like feedback, docs, or packager. + +### The "don't do that" section +Don't remove any credit to Scratch, TurboWarp, or PenguinMod. That's just not cool. +Imagine if someone just forked your copy and pretended they made it all themselves. + +Don't change the license or visibility of your repositories if you don't know or understand what you are doing. + +# Server changes +Unless you plan on keeping your mod 100% compatible with PenguinMod, please remove the Upload button and any project sharing features. + +Our APIs are only built for PenguinMod and therefore will likely end up breaking in your mod at some point or another. + +We also do not allow projects that only work outside of PenguinMod so if we end up having a lot of broken uploads from your site, then we'll have to block your site from being able to use the project API. diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000000000000000000000000000000000000..f288702d2fa16d3cdf0035b15a9fcbc552cd88e7 --- /dev/null +++ b/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/ORIGINAL_README.md b/ORIGINAL_README.md new file mode 100644 index 0000000000000000000000000000000000000000..0968bfc4111f35f01976bb18cc11ca5ff01139cf --- /dev/null +++ b/ORIGINAL_README.md @@ -0,0 +1,298 @@ +--- +sdk: docker +app_port: 3000 +--- +scratch-gui modified for use in [TurboWarp](https://turbowarp.org/) then modified for use in [PenguinMod](https://studio.penguinmod.com) 😀 +[![Open in Gitpod](https://gitpod.io/button/open-in-gitpod.svg)](https://gitpod.io/#https://github.com/PenguinMod/penguinmod.github.io/) +## Setup + +See https://docs.turbowarp.org/development/getting-started to setup the complete TurboWarp environment. + +If you just want to play with the GUI then it's the same process as upstream scratch-gui. + +## License + +TurboWarp's modifications to Scratch are licensed under the GNU General Public License v3.0. See LICENSE or https://www.gnu.org/licenses/ for details. + +The following is the original license for scratch-gui, which we are required to retain. This is NOT the license of this project. + +``` +Copyright (c) 2016, Massachusetts Institute of Technology +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +``` + +src/lib/default-project/dango.svg is based on [Twemoji](https://twemoji.twitter.com/) and is licensed under CC BY 4.0 https://creativecommons.org/licenses/by/4.0/ + + \ No newline at end of file diff --git a/README.md b/README.md index aa853a76dda2397121a2264c38a7c40235d61fde..0968bfc4111f35f01976bb18cc11ca5ff01139cf 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,298 @@ --- -title: Soiz1 S4s Editor -emoji: 🏆 -colorFrom: gray -colorTo: yellow sdk: docker -pinned: false +app_port: 3000 --- +scratch-gui modified for use in [TurboWarp](https://turbowarp.org/) then modified for use in [PenguinMod](https://studio.penguinmod.com) 😀 +[![Open in Gitpod](https://gitpod.io/button/open-in-gitpod.svg)](https://gitpod.io/#https://github.com/PenguinMod/penguinmod.github.io/) +## Setup -Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference +See https://docs.turbowarp.org/development/getting-started to setup the complete TurboWarp environment. + +If you just want to play with the GUI then it's the same process as upstream scratch-gui. + +## License + +TurboWarp's modifications to Scratch are licensed under the GNU General Public License v3.0. See LICENSE or https://www.gnu.org/licenses/ for details. + +The following is the original license for scratch-gui, which we are required to retain. This is NOT the license of this project. + +``` +Copyright (c) 2016, Massachusetts Institute of Technology +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +``` + +src/lib/default-project/dango.svg is based on [Twemoji](https://twemoji.twitter.com/) and is licensed under CC BY 4.0 https://creativecommons.org/licenses/by/4.0/ + + \ No newline at end of file diff --git a/build.js b/build.js new file mode 100644 index 0000000000000000000000000000000000000000..575fd70d75940bc99736f946e867574188603e94 --- /dev/null +++ b/build.js @@ -0,0 +1,3 @@ +var ghpages = require('gh-pages'); + +ghpages.publish('src', function(err) {}); diff --git a/docs/project_state_diagram.svg b/docs/project_state_diagram.svg new file mode 100644 index 0000000000000000000000000000000000000000..e24382e5a0b4398bc1c17d9d719a05f50c09ffb5 Binary files /dev/null and b/docs/project_state_diagram.svg differ diff --git a/docs/project_state_example.png b/docs/project_state_example.png new file mode 100644 index 0000000000000000000000000000000000000000..4cda1a5cc360d94e4f1047e7253c0f4d6e64096f Binary files /dev/null and b/docs/project_state_example.png differ diff --git a/favicon.ico b/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..7902be7a25a944acb76ef00b73f721e76bca444b --- /dev/null +++ b/favicon.ico @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7b6414945f53b55f68a2b3f62381e2ab92f2385a39a5329bfd7a8baa2e2ecba2 +size 238142 diff --git a/favicon.png b/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..5edd20a8cfbfbac54e21554850b882cfc89597eb Binary files /dev/null and b/favicon.png differ diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000000000000000000000000000000000000..953312fcdc822cb039622e44c56e8a5a93484020 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,20865 @@ +{ + "name": "scratch-gui", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "scratch-gui", + "version": "0.1.0", + "license": "GPL-3.0", + "dependencies": { + "@turbowarp/jszip": "^3.11.1", + "@turbowarp/scratch-l10n": "^3.1000.20230326022803", + "arraybuffer-loader": "^1.0.8", + "autoprefixer": "^9.8.8", + "base64-loader": "1.0.0", + "bowser": "1.9.4", + "classnames": "2.2.6", + "computed-style-to-inline-style": "3.0.0", + "copy-webpack-plugin": "6.4.1", + "core-js": "2.5.7", + "css-loader": "^1.0.1", + "es6-object-assign": "1.1.0", + "file-loader": "2.0.0", + "get-float-time-domain-data": "0.1.0", + "get-user-media-promise": "1.1.4", + "immutable": "3.8.2", + "intl": "1.2.5", + "intl-messageformat": "^2.2.0", + "js-base64": "2.4.9", + "jszip": "^3.10.1", + "keymirror": "0.1.1", + "localforage": "^1.10.0", + "lodash.bindall": "4.4.0", + "lodash.debounce": "4.0.8", + "lodash.omit": "4.5.0", + "lodash.throttle": "4.0.1", + "minilog": "3.1.0", + "omggif": "1.0.9", + "papaparse": "5.3.0", + "PenguinMod-MarkDown": "github:PenguinMod/PenguinMod-MarkDown#master", + "pmp-protobuf": "^1.5.1", + "postcss-import": "^12.0.1", + "postcss-loader": "^3.0.0", + "postcss-simple-vars": "^5.0.2", + "prop-types": "^15.8.1", + "protobufjs": "^7.3.2", + "query-string": "^5.1.1", + "raw-loader": "^0.5.1", + "react": "^16.0.0", + "react-contextmenu": "2.9.4", + "react-dom": "^16.0.0", + "react-draggable": "3.0.5", + "react-ga": "2.5.3", + "react-intl": "2.9.0", + "react-intl-redux": "0.7.0", + "react-modal": "3.9.1", + "react-popover": "0.5.10", + "react-redux": "5.0.7", + "react-responsive": "^4.1.0", + "react-string-replace": "^0.4.4", + "react-style-proptype": "3.2.2", + "react-tabs": "2.3.0", + "react-tooltip": "3.8.0", + "react-virtualized": "9.20.1", + "redux": "3.7.2", + "redux-throttle": "0.1.1", + "scratch-audio": "github:PenguinMod/PenguinMod-Audio#develop", + "scratch-blocks": "github:PenguinMod/PenguinMod-Blocks#develop-builds", + "scratch-paint": "github:PenguinMod/PenguinMod-Paint#develop", + "scratch-render": "github:PenguinMod/PenguinMod-Render#develop", + "scratch-render-fonts": "github:PenguinMod/penguinmod-render-fonts#master", + "scratch-storage": "github:PenguinMod/PenguinMod-Storage#develop", + "scratch-svg-renderer": "github:PenguinMod/penguinmod-svg-renderer#develop", + "scratch-vm": "github:PenguinMod/PenguinMod-Vm#develop", + "startaudiocontext": "1.2.1", + "style-loader": "^0.23.1", + "text-encoding": "0.7.0", + "theia": "github:FreshPenguin112/theia-pnpm#master", + "to-style": "1.3.3", + "wav-encoder": "1.3.0", + "xhr": "2.5.0" + }, + "devDependencies": { + "@babel/cli": "7.14.8", + "@babel/core": "7.14.8", + "@babel/plugin-proposal-object-rest-spread": "7.14.7", + "@babel/plugin-syntax-dynamic-import": "7.2.0", + "@babel/plugin-transform-async-to-generator": "7.14.5", + "@babel/preset-env": "7.14.8", + "@babel/preset-react": "7.14.5", + "babel-core": "7.0.0-bridge.0", + "babel-eslint": "10.0.3", + "babel-loader": "8.2.2", + "chromedriver": "105.0.0", + "cross-env": "^7.0.3", + "enzyme": "3.10.0", + "enzyme-adapter-react-16": "1.3.0", + "eslint": "5.16.0", + "eslint-config-scratch": "6.0.0", + "eslint-import-resolver-webpack": "0.11.1", + "eslint-plugin-import": "2.23.4", + "eslint-plugin-jest": "22.17.0", + "eslint-plugin-react": "7.24.0", + "gh-pages": "3.2.3", + "html-webpack-plugin": "^4.5.2", + "jest": "21.2.1", + "jest-junit": "7.0.0", + "lodash.defaultsdeep": "4.6.1", + "mkdirp": "1.0.3", + "raf": "3.4.1", + "react-test-renderer": "16.2.0", + "redux-mock-store": "1.5.3", + "rimraf": "2.7.1", + "selenium-webdriver": "3.6.0", + "uglifyjs-webpack-plugin": "1.3.0", + "url-loader": "^4.1.1", + "web-audio-test-api": "0.5.2", + "webpack": "4.46.0", + "webpack-cli": "3.3.12", + "webpack-dev-server": "3.11.2", + "webpack-sources": "3.2.3" + }, + "peerDependencies": { + "react": "^16.0.0", + "react-dom": "^16.0.0" + } + }, + "node_modules/@babel/cli": { + "version": "7.14.8", + "license": "MIT", + "dependencies": { + "commander": "^4.0.1", + "convert-source-map": "^1.1.0", + "fs-readdir-recursive": "^1.1.0", + "glob": "^7.0.0", + "make-dir": "^2.1.0", + "slash": "^2.0.0", + "source-map": "^0.5.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.2", + "chokidar": "^3.4.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.27.1", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.28.0", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.14.8", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.14.5", + "@babel/generator": "^7.14.8", + "@babel/helper-compilation-targets": "^7.14.5", + "@babel/helper-module-transforms": "^7.14.8", + "@babel/helpers": "^7.14.8", + "@babel/parser": "^7.14.8", + "@babel/template": "^7.14.5", + "@babel/traverse": "^7.14.8", + "@babel/types": "^7.14.8", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.1.2", + "semver": "^6.3.0", + "source-map": "^0.5.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.28.0", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.0", + "@babel/types": "^7.28.0", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.27.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.3" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.27.2", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.27.2", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-member-expression-to-functions": "^7.27.1", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/traverse": "^7.27.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "regexpu-core": "^6.2.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.2.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.13.0", + "@babel/helper-module-imports": "^7.12.13", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/traverse": "^7.13.0", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2", + "semver": "^6.1.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0-0" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.27.1", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.27.3", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.27.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.27.1", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-wrap-function": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.27.1", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.27.1", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.27.1", + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.27.6", + "license": "MIT", + "dependencies": { + "@babel/template": "^7.27.2", + "@babel/types": "^7.27.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.28.0", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-transform-optional-chaining": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-proposal-async-generator-functions": { + "version": "7.20.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-plugin-utils": "^7.20.2", + "@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", + "dev": true, + "license": "MIT", + "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.21.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.21.0", + "@babel/helper-plugin-utils": "^7.20.2", + "@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", + "dev": true, + "license": "MIT", + "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-dynamic-import/node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-export-namespace-from": { + "version": "7.18.9", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "MIT", + "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.20.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2", + "@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", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "MIT", + "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.14.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.14.7", + "@babel/helper-compilation-targets": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-optional-catch-binding": { + "version": "7.18.6", + "dev": true, + "license": "MIT", + "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.21.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", + "@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", + "dev": true, + "license": "MIT", + "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.21.11", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-create-class-features-plugin": "^7.21.0", + "@babel/helper-plugin-utils": "^7.20.2", + "@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", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "MIT", + "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.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "MIT", + "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.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.14.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-remap-async-to-generator": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.28.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.28.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-globals": "^7.28.0", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1", + "@babel/traverse": "^7.28.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/template": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.28.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.28.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.27.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-display-name": { + "version": "7.28.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-development": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/plugin-transform-react-jsx": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-pure-annotations": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.28.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.14.8", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.14.7", + "@babel/helper-compilation-targets": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-validator-option": "^7.14.5", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.14.5", + "@babel/plugin-proposal-async-generator-functions": "^7.14.7", + "@babel/plugin-proposal-class-properties": "^7.14.5", + "@babel/plugin-proposal-class-static-block": "^7.14.5", + "@babel/plugin-proposal-dynamic-import": "^7.14.5", + "@babel/plugin-proposal-export-namespace-from": "^7.14.5", + "@babel/plugin-proposal-json-strings": "^7.14.5", + "@babel/plugin-proposal-logical-assignment-operators": "^7.14.5", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.14.5", + "@babel/plugin-proposal-numeric-separator": "^7.14.5", + "@babel/plugin-proposal-object-rest-spread": "^7.14.7", + "@babel/plugin-proposal-optional-catch-binding": "^7.14.5", + "@babel/plugin-proposal-optional-chaining": "^7.14.5", + "@babel/plugin-proposal-private-methods": "^7.14.5", + "@babel/plugin-proposal-private-property-in-object": "^7.14.5", + "@babel/plugin-proposal-unicode-property-regex": "^7.14.5", + "@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-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.14.5", + "@babel/plugin-transform-async-to-generator": "^7.14.5", + "@babel/plugin-transform-block-scoped-functions": "^7.14.5", + "@babel/plugin-transform-block-scoping": "^7.14.5", + "@babel/plugin-transform-classes": "^7.14.5", + "@babel/plugin-transform-computed-properties": "^7.14.5", + "@babel/plugin-transform-destructuring": "^7.14.7", + "@babel/plugin-transform-dotall-regex": "^7.14.5", + "@babel/plugin-transform-duplicate-keys": "^7.14.5", + "@babel/plugin-transform-exponentiation-operator": "^7.14.5", + "@babel/plugin-transform-for-of": "^7.14.5", + "@babel/plugin-transform-function-name": "^7.14.5", + "@babel/plugin-transform-literals": "^7.14.5", + "@babel/plugin-transform-member-expression-literals": "^7.14.5", + "@babel/plugin-transform-modules-amd": "^7.14.5", + "@babel/plugin-transform-modules-commonjs": "^7.14.5", + "@babel/plugin-transform-modules-systemjs": "^7.14.5", + "@babel/plugin-transform-modules-umd": "^7.14.5", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.14.7", + "@babel/plugin-transform-new-target": "^7.14.5", + "@babel/plugin-transform-object-super": "^7.14.5", + "@babel/plugin-transform-parameters": "^7.14.5", + "@babel/plugin-transform-property-literals": "^7.14.5", + "@babel/plugin-transform-regenerator": "^7.14.5", + "@babel/plugin-transform-reserved-words": "^7.14.5", + "@babel/plugin-transform-shorthand-properties": "^7.14.5", + "@babel/plugin-transform-spread": "^7.14.6", + "@babel/plugin-transform-sticky-regex": "^7.14.5", + "@babel/plugin-transform-template-literals": "^7.14.5", + "@babel/plugin-transform-typeof-symbol": "^7.14.5", + "@babel/plugin-transform-unicode-escapes": "^7.14.5", + "@babel/plugin-transform-unicode-regex": "^7.14.5", + "@babel/preset-modules": "^0.1.4", + "@babel/types": "^7.14.8", + "babel-plugin-polyfill-corejs2": "^0.2.2", + "babel-plugin-polyfill-corejs3": "^0.2.2", + "babel-plugin-polyfill-regenerator": "^0.2.2", + "core-js-compat": "^3.15.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env/node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.6", + "dev": true, + "license": "MIT", + "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 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/preset-react": { + "version": "7.14.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-validator-option": "^7.14.5", + "@babel/plugin-transform-react-display-name": "^7.14.5", + "@babel/plugin-transform-react-jsx": "^7.14.5", + "@babel/plugin-transform-react-jsx-development": "^7.14.5", + "@babel/plugin-transform-react-pure-annotations": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.27.6", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.27.2", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.28.0", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.0", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.0", + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.0", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.28.0", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@gar/promisify": { + "version": "1.1.3", + "license": "MIT" + }, + "node_modules/@jest/types": { + "version": "24.9.0", + "dev": true, + "license": "MIT", + "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.3.12", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.4", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.29", + "license": "MIT", + "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.2", + "license": "MIT", + "optional": true, + "dependencies": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "glob-parent": "^5.1.2", + "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" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@npmcli/fs": { + "version": "1.1.1", + "license": "ISC", + "dependencies": { + "@gar/promisify": "^1.0.1", + "semver": "^7.3.5" + } + }, + "node_modules/@npmcli/fs/node_modules/semver": { + "version": "7.7.2", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@npmcli/move-file": { + "version": "1.1.2", + "license": "MIT", + "dependencies": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@npmcli/move-file/node_modules/mkdirp": { + "version": "1.0.4", + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@npmcli/move-file/node_modules/rimraf": { + "version": "3.0.2", + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "license": "BSD-3-Clause", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "license": "BSD-3-Clause" + }, + "node_modules/@sindresorhus/is": { + "version": "0.7.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/@testim/chrome-version": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/@transifex/api": { + "version": "4.3.0", + "license": "Apache-2.0", + "dependencies": { + "core-js": "^3.22.4" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@transifex/api/node_modules/core-js": { + "version": "3.43.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.43.0.tgz", + "integrity": "sha512-N6wEbTTZSYOY2rYAn85CuvWWkCK6QweMn7/4Nr3w+gDBeBhk/x4EJeY6FPo4QzDoJZxVTv8U7CMvgWk6pOHHqA==", + "hasInstallScript": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/@turbowarp/json": { + "version": "0.1.2", + "license": "MIT" + }, + "node_modules/@turbowarp/jszip": { + "version": "3.11.1", + "license": "(MIT OR GPL-3.0-or-later)", + "dependencies": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "setimmediate": "^1.0.5" + } + }, + "node_modules/@turbowarp/nanolog": { + "version": "0.2.0", + "license": "MIT" + }, + "node_modules/@turbowarp/paper": { + "version": "0.12.202505131813", + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@turbowarp/scratch-l10n": { + "version": "3.1001.202405101234", + "license": "BSD-3-Clause", + "dependencies": { + "@babel/cli": "^7.1.2", + "@babel/core": "^7.1.2", + "@transifex/api": "4.3.0", + "babel-plugin-react-intl": "^3.0.1", + "download": "^8.0.0", + "transifex": "1.6.6" + }, + "bin": { + "build-i18n-src": "scripts/build-i18n-src.js", + "tx-push-src": "scripts/tx-push-src.js" + } + }, + "node_modules/@turbowarp/startaudiocontext": { + "version": "1.0.0", + "license": "MIT" + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.7", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/glob": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "node_modules/@types/html-minifier-terser": { + "version": "5.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "*", + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "license": "MIT" + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/minimatch": { + "version": "5.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "24.0.10", + "license": "MIT", + "dependencies": { + "undici-types": "~7.8.0" + } + }, + "node_modules/@types/source-list-map": { + "version": "0.1.6", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/tapable": { + "version": "1.0.12", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/trusted-types": { + "version": "2.0.7", + "license": "MIT", + "optional": true + }, + "node_modules/@types/uglify-js": { + "version": "3.17.5", + "dev": true, + "license": "MIT", + "dependencies": { + "source-map": "^0.6.1" + } + }, + "node_modules/@types/uglify-js/node_modules/source-map": { + "version": "0.6.1", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@types/webpack": { + "version": "4.41.40", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/tapable": "^1", + "@types/uglify-js": "*", + "@types/webpack-sources": "*", + "anymatch": "^3.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/@types/webpack-sources": { + "version": "3.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/source-list-map": "*", + "source-map": "^0.7.3" + } + }, + "node_modules/@types/webpack-sources/node_modules/source-map": { + "version": "0.7.4", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@types/webpack/node_modules/anymatch": { + "version": "3.1.3", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@types/webpack/node_modules/source-map": { + "version": "0.6.1", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@types/yargs": { + "version": "13.0.12", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/yauzl": { + "version": "2.10.3", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@typescript-eslint/experimental-utils": { + "version": "1.13.0", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "BSD-2-Clause", + "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", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/@vernier/godirect": { + "version": "1.5.0", + "license": "BSD-3-Clause" + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.9.0", + "license": "MIT", + "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", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.9.0", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.9.0", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-code-frame": { + "version": "1.9.0", + "license": "MIT", + "dependencies": { + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "node_modules/@webassemblyjs/helper-fsm": { + "version": "1.9.0", + "license": "ISC" + }, + "node_modules/@webassemblyjs/helper-module-context": { + "version": "1.9.0", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.9.0" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.9.0", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.9.0", + "license": "MIT", + "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", + "license": "MIT", + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.9.0", + "license": "MIT", + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.9.0", + "license": "MIT" + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.9.0", + "license": "MIT", + "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", + "license": "MIT", + "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", + "license": "MIT", + "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", + "license": "MIT", + "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", + "license": "MIT", + "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", + "license": "MIT", + "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", + "license": "BSD-3-Clause" + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "license": "Apache-2.0" + }, + "node_modules/abab": { + "version": "1.0.4", + "dev": true, + "license": "ISC" + }, + "node_modules/accepts": { + "version": "1.3.8", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/accepts/node_modules/negotiator": { + "version": "0.6.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "6.4.2", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-globals": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^4.0.4" + } + }, + "node_modules/acorn-globals/node_modules/acorn": { + "version": "4.0.13", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "license": "MIT", + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/airbnb-prop-types": { + "version": "2.16.0", + "dev": true, + "license": "MIT", + "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", + "license": "MIT", + "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", + "license": "MIT", + "peerDependencies": { + "ajv": ">=5.0.0" + } + }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/ansi-colors": { + "version": "3.2.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-escapes": { + "version": "3.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/ansi-html": { + "version": "0.0.7", + "dev": true, + "engines": [ + "node >= 0.8.0" + ], + "license": "Apache-2.0", + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/ansi-regex": { + "version": "2.1.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ansi-styles": { + "version": "2.2.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/anymatch": { + "version": "2.0.0", + "devOptional": true, + "license": "ISC", + "dependencies": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "node_modules/anymatch/node_modules/normalize-path": { + "version": "2.1.1", + "devOptional": true, + "license": "MIT", + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/append-transform": { + "version": "0.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "default-require-extensions": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/aproba": { + "version": "1.2.0", + "license": "ISC" + }, + "node_modules/archive-type": { + "version": "4.0.0", + "license": "MIT", + "dependencies": { + "file-type": "^4.2.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/archive-type/node_modules/file-type": { + "version": "4.4.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/argparse": { + "version": "1.0.10", + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/arr-diff": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-flatten": { + "version": "1.1.0", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-union": { + "version": "3.1.0", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-equal": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/array-find": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/array-flatten": { + "version": "2.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/array-includes": { + "version": "3.1.9", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.0", + "es-object-atoms": "^1.1.1", + "get-intrinsic": "^1.3.0", + "is-string": "^1.1.1", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-includes/node_modules/es-abstract": { + "version": "1.24.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz", + "integrity": "sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.3.0", + "get-proto": "^1.0.1", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.2", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.2.1", + "is-set": "^2.0.3", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.1", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.4", + "object-keys": "^1.1.1", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.4", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "stop-iteration-iterator": "^1.1.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.19" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/array-uniq": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-unique": { + "version": "0.3.2", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array.prototype.filter": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-array-method-boxes-properly": "^1.0.0", + "es-object-atoms": "^1.0.0", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.filter/node_modules/es-abstract": { + "version": "1.24.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz", + "integrity": "sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.3.0", + "get-proto": "^1.0.1", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.2", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.2.1", + "is-set": "^2.0.3", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.1", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.4", + "object-keys": "^1.1.1", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.4", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "stop-iteration-iterator": "^1.1.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.19" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.find": { + "version": "2.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.find/node_modules/es-abstract": { + "version": "1.24.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz", + "integrity": "sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.3.0", + "get-proto": "^1.0.1", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.2", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.2.1", + "is-set": "^2.0.3", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.1", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.4", + "object-keys": "^1.1.1", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.4", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "stop-iteration-iterator": "^1.1.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.19" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.3", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat/node_modules/es-abstract": { + "version": "1.24.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz", + "integrity": "sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.3.0", + "get-proto": "^1.0.1", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.2", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.2.1", + "is-set": "^2.0.3", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.1", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.4", + "object-keys": "^1.1.1", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.4", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "stop-iteration-iterator": "^1.1.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.19" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.3", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap/node_modules/es-abstract": { + "version": "1.24.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz", + "integrity": "sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.3.0", + "get-proto": "^1.0.1", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.2", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.2.1", + "is-set": "^2.0.3", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.1", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.4", + "object-keys": "^1.1.1", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.4", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "stop-iteration-iterator": "^1.1.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.19" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.reduce": { + "version": "1.0.8", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-array-method-boxes-properly": "^1.0.0", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "is-string": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.reduce/node_modules/es-abstract": { + "version": "1.24.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz", + "integrity": "sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.3.0", + "get-proto": "^1.0.1", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.2", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.2.1", + "is-set": "^2.0.3", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.1", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.4", + "object-keys": "^1.1.1", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.4", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "stop-iteration-iterator": "^1.1.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.19" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/arraybuffer-loader": { + "version": "1.0.8", + "license": "MIT", + "dependencies": { + "loader-utils": "^1.1.0" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/arrify": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/asap": { + "version": "2.0.6", + "dev": true, + "license": "MIT" + }, + "node_modules/asn1": { + "version": "0.2.6", + "license": "MIT", + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "node_modules/asn1.js": { + "version": "4.10.1", + "license": "MIT", + "dependencies": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/asn1.js/node_modules/bn.js": { + "version": "4.12.2", + "license": "MIT" + }, + "node_modules/assert": { + "version": "1.5.1", + "license": "MIT", + "dependencies": { + "object.assign": "^4.1.4", + "util": "^0.10.4" + } + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/assert/node_modules/inherits": { + "version": "2.0.3", + "license": "ISC" + }, + "node_modules/assert/node_modules/util": { + "version": "0.10.4", + "license": "MIT", + "dependencies": { + "inherits": "2.0.3" + } + }, + "node_modules/assign-symbols": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/astral-regex": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/async": { + "version": "2.6.4", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash": "^4.17.14" + } + }, + "node_modules/async-each": { + "version": "1.0.6", + "devOptional": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "license": "MIT" + }, + "node_modules/async-function": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/async-limiter": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "license": "MIT" + }, + "node_modules/atob": { + "version": "2.1.2", + "license": "(MIT OR Apache-2.0)", + "bin": { + "atob": "bin/atob.js" + }, + "engines": { + "node": ">= 4.5.0" + } + }, + "node_modules/automation-events": { + "version": "7.1.11", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.27.6", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=18.2.0" + } + }, + "node_modules/autoprefixer": { + "version": "9.8.8", + "license": "MIT", + "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/autoprefixer/node_modules/picocolors": { + "version": "0.2.1", + "license": "ISC" + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/aws-sign2": { + "version": "0.7.0", + "license": "Apache-2.0", + "engines": { + "node": "*" + } + }, + "node_modules/aws4": { + "version": "1.13.2", + "license": "MIT" + }, + "node_modules/axios": { + "version": "0.27.2", + "dev": true, + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.14.9", + "form-data": "^4.0.0" + } + }, + "node_modules/babel-code-frame": { + "version": "6.26.0", + "license": "MIT", + "dependencies": { + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" + } + }, + "node_modules/babel-code-frame/node_modules/js-tokens": { + "version": "3.0.2", + "license": "MIT" + }, + "node_modules/babel-core": { + "version": "7.0.0-bridge.0", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-eslint": { + "version": "10.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@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" + }, + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "eslint": ">= 4.12.1" + } + }, + "node_modules/babel-generator": { + "version": "6.26.1", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + } + }, + "node_modules/babel-helpers": { + "version": "6.24.1", + "dev": true, + "license": "MIT", + "dependencies": { + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "node_modules/babel-jest": { + "version": "21.2.0", + "dev": true, + "license": "MIT", + "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.2.2", + "dev": true, + "license": "MIT", + "dependencies": { + "find-cache-dir": "^3.3.1", + "loader-utils": "^1.4.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/make-dir": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/babel-messages": { + "version": "6.23.0", + "dev": true, + "license": "MIT", + "dependencies": { + "babel-runtime": "^6.22.0" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "4.1.6", + "dev": true, + "license": "BSD-3-Clause", + "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", + "dev": true, + "license": "MIT" + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.13.11", + "@babel/helper-define-polyfill-provider": "^0.2.4", + "semver": "^6.1.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.2.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.2.2", + "core-js-compat": "^3.16.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.2.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-react-intl": { + "version": "3.5.1", + "license": "BSD-3-Clause", + "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-syntax-object-rest-spread": { + "version": "6.13.0", + "dev": true, + "license": "MIT" + }, + "node_modules/babel-preset-jest": { + "version": "21.2.0", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/babel-register/node_modules/json5": { + "version": "0.5.1", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/babel-register/node_modules/mkdirp": { + "version": "0.5.6", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/babel-register/node_modules/ms": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/babel-register/node_modules/slash": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/babel-register/node_modules/source-map-support": { + "version": "0.4.18", + "dev": true, + "license": "MIT", + "dependencies": { + "source-map": "^0.5.6" + } + }, + "node_modules/babel-runtime": { + "version": "6.26.0", + "license": "MIT", + "dependencies": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + }, + "node_modules/babel-template": { + "version": "6.26.0", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/babel-traverse/node_modules/globals": { + "version": "9.18.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/babel-traverse/node_modules/ms": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/babel-types": { + "version": "6.26.0", + "dev": true, + "license": "MIT", + "dependencies": { + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" + } + }, + "node_modules/babylon": { + "version": "6.18.0", + "dev": true, + "license": "MIT", + "bin": { + "babylon": "bin/babylon.js" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "license": "MIT" + }, + "node_modules/base": { + "version": "0.11.2", + "license": "MIT", + "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", + "license": "MIT", + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/base64-loader": { + "version": "1.0.0", + "license": "MIT" + }, + "node_modules/batch": { + "version": "0.6.1", + "dev": true, + "license": "MIT" + }, + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "license": "BSD-3-Clause", + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, + "node_modules/big.js": { + "version": "5.2.2", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "1.13.1", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/bindings": { + "version": "1.5.0", + "license": "MIT", + "optional": true, + "dependencies": { + "file-uri-to-path": "1.0.0" + } + }, + "node_modules/bl": { + "version": "1.2.3", + "license": "MIT", + "dependencies": { + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/bluebird": { + "version": "3.7.2", + "license": "MIT" + }, + "node_modules/bn.js": { + "version": "5.2.2", + "license": "MIT" + }, + "node_modules/body-parser": { + "version": "1.20.3", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "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.13.0", + "raw-body": "2.5.2", + "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/debug": { + "version": "2.6.9", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/iconv-lite": { + "version": "0.4.24", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/body-parser/node_modules/qs": { + "version": "6.13.0", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/bonjour": { + "version": "3.5.0", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "ISC" + }, + "node_modules/bowser": { + "version": "1.9.4", + "license": "MIT" + }, + "node_modules/brace-expansion": { + "version": "1.1.12", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "2.3.2", + "license": "MIT", + "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/brfs": { + "version": "1.6.1", + "license": "MIT", + "dependencies": { + "quote-stream": "^1.0.1", + "resolve": "^1.1.5", + "static-module": "^2.2.0", + "through2": "^2.0.0" + }, + "bin": { + "brfs": "bin/cmd.js" + } + }, + "node_modules/brorand": { + "version": "1.1.0", + "license": "MIT" + }, + "node_modules/browser-resolve": { + "version": "1.11.3", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve": "1.1.7" + } + }, + "node_modules/browser-resolve/node_modules/resolve": { + "version": "1.1.7", + "dev": true, + "license": "MIT" + }, + "node_modules/browser-stdout": { + "version": "1.3.0", + "license": "ISC" + }, + "node_modules/browserify-aes": { + "version": "1.2.0", + "license": "MIT", + "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", + "license": "MIT", + "dependencies": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "node_modules/browserify-des": { + "version": "1.0.2", + "license": "MIT", + "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.1", + "license": "MIT", + "dependencies": { + "bn.js": "^5.2.1", + "randombytes": "^2.1.0", + "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/browserify-sign": { + "version": "4.2.3", + "license": "ISC", + "dependencies": { + "bn.js": "^5.2.1", + "browserify-rsa": "^4.1.0", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.5", + "hash-base": "~3.0", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.7", + "readable-stream": "^2.3.8", + "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/browserify-zlib": { + "version": "0.2.0", + "license": "MIT", + "dependencies": { + "pako": "~1.0.5" + } + }, + "node_modules/browserslist": { + "version": "4.25.1", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "caniuse-lite": "^1.0.30001726", + "electron-to-chromium": "^1.5.173", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/btoa": { + "version": "1.2.1", + "license": "(MIT OR Apache-2.0)", + "bin": { + "btoa": "bin/btoa.js" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/buffer": { + "version": "4.9.2", + "license": "MIT", + "dependencies": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "node_modules/buffer-alloc": { + "version": "1.2.0", + "license": "MIT", + "dependencies": { + "buffer-alloc-unsafe": "^1.1.0", + "buffer-fill": "^1.0.0" + } + }, + "node_modules/buffer-alloc-unsafe": { + "version": "1.1.0", + "license": "MIT" + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/buffer-equal": { + "version": "0.0.1", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/buffer-fill": { + "version": "1.0.0", + "license": "MIT" + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "license": "MIT" + }, + "node_modules/buffer-indexof": { + "version": "1.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/buffer-xor": { + "version": "1.0.3", + "license": "MIT" + }, + "node_modules/buffer/node_modules/isarray": { + "version": "1.0.0", + "license": "MIT" + }, + "node_modules/builtin-modules": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/builtin-status-codes": { + "version": "3.0.0", + "license": "MIT" + }, + "node_modules/bytes": { + "version": "3.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cacache": { + "version": "15.3.0", + "license": "ISC", + "dependencies": { + "@npmcli/fs": "^1.0.0", + "@npmcli/move-file": "^1.0.1", + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "infer-owner": "^1.0.4", + "lru-cache": "^6.0.0", + "minipass": "^3.1.1", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^1.0.3", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.1", + "tar": "^6.0.2", + "unique-filename": "^1.1.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/cacache/node_modules/lru-cache": { + "version": "6.0.0", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cacache/node_modules/rimraf": { + "version": "3.0.2", + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/cacache/node_modules/yallist": { + "version": "4.0.0", + "license": "ISC" + }, + "node_modules/cache-base": { + "version": "1.0.1", + "license": "MIT", + "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/cacheable-request": { + "version": "2.1.4", + "license": "MIT", + "dependencies": { + "clone-response": "1.0.2", + "get-stream": "3.0.0", + "http-cache-semantics": "3.8.1", + "keyv": "3.0.0", + "lowercase-keys": "1.0.0", + "normalize-url": "2.0.1", + "responselike": "1.0.2" + } + }, + "node_modules/cacheable-request/node_modules/get-stream": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/cacheable-request/node_modules/lowercase-keys": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/call-bind": { + "version": "1.0.8", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/caller-callsite": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "callsites": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/caller-path": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "caller-callsite": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/callsites": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/camel-case": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "node_modules/camelcase": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001726", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/cannon-es": { + "version": "0.20.0", + "license": "MIT" + }, + "node_modules/canvas-toBlob": { + "version": "1.0.0", + "license": "MIT" + }, + "node_modules/capture-exit": { + "version": "1.2.0", + "dev": true, + "license": "ISC", + "dependencies": { + "rsvp": "^3.3.3" + } + }, + "node_modules/caseless": { + "version": "0.12.0", + "license": "Apache-2.0" + }, + "node_modules/chalk": { + "version": "1.1.3", + "license": "MIT", + "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/chardet": { + "version": "0.7.0", + "dev": true, + "license": "MIT" + }, + "node_modules/cheerio": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "cheerio-select": "^2.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.2.2", + "encoding-sniffer": "^0.2.0", + "htmlparser2": "^10.0.0", + "parse5": "^7.3.0", + "parse5-htmlparser2-tree-adapter": "^7.1.0", + "parse5-parser-stream": "^7.1.2", + "undici": "^7.10.0", + "whatwg-mimetype": "^4.0.0" + }, + "engines": { + "node": ">=18.17" + }, + "funding": { + "url": "https://github.com/cheeriojs/cheerio?sponsor=1" + } + }, + "node_modules/cheerio-select": { + "version": "2.1.0", + "dev": true, + "license": "BSD-2-Clause", + "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.6.0", + "license": "MIT", + "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" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/anymatch": { + "version": "3.1.3", + "license": "ISC", + "optional": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/chokidar/node_modules/binary-extensions": { + "version": "2.3.0", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/chokidar/node_modules/braces": { + "version": "3.0.3", + "license": "MIT", + "optional": true, + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/chokidar/node_modules/fill-range": { + "version": "7.1.1", + "license": "MIT", + "optional": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/chokidar/node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/chokidar/node_modules/is-binary-path": { + "version": "2.1.0", + "license": "MIT", + "optional": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/chokidar/node_modules/is-number": { + "version": "7.0.0", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/chokidar/node_modules/readdirp": { + "version": "3.6.0", + "license": "MIT", + "optional": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/chokidar/node_modules/to-regex-range": { + "version": "5.0.1", + "license": "MIT", + "optional": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.4", + "license": "MIT", + "engines": { + "node": ">=6.0" + } + }, + "node_modules/chromedriver": { + "version": "105.0.0", + "dev": true, + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@testim/chrome-version": "^1.1.2", + "axios": "^0.27.2", + "del": "^6.0.0", + "extract-zip": "^2.0.1", + "https-proxy-agent": "^5.0.0", + "proxy-from-env": "^1.1.0", + "tcp-port-used": "^1.0.1" + }, + "bin": { + "chromedriver": "bin/chromedriver" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ci-info": { + "version": "1.6.0", + "dev": true, + "license": "MIT" + }, + "node_modules/cipher-base": { + "version": "1.0.6", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.4", + "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/class-utils": { + "version": "0.3.6", + "license": "MIT", + "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", + "license": "MIT", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-descriptor": { + "version": "0.1.7", + "license": "MIT", + "dependencies": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/classnames": { + "version": "2.2.6", + "license": "MIT" + }, + "node_modules/clean-css": { + "version": "4.2.4", + "dev": true, + "license": "MIT", + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/clean-css/node_modules/source-map": { + "version": "0.6.1", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-cursor": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "restore-cursor": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cli-width": { + "version": "2.2.1", + "dev": true, + "license": "ISC" + }, + "node_modules/cliui": { + "version": "3.2.0", + "license": "ISC", + "dependencies": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } + }, + "node_modules/cliui/node_modules/is-fullwidth-code-point": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "number-is-nan": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cliui/node_modules/string-width": { + "version": "1.0.2", + "license": "MIT", + "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/clone-response": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "mimic-response": "^1.0.0" + } + }, + "node_modules/code-point-at": { + "version": "1.1.0", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/collection-visit": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/color-convert": { + "version": "0.5.3" + }, + "node_modules/color-name": { + "version": "1.1.3", + "license": "MIT" + }, + "node_modules/colors": { + "version": "0.6.2", + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "4.1.1", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/commondir": { + "version": "1.0.1", + "license": "MIT" + }, + "node_modules/complex.js": { + "version": "2.4.2", + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/component-emitter": { + "version": "1.3.1", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/compressible": { + "version": "2.0.18", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.8.0", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "compressible": "~2.0.18", + "debug": "2.6.9", + "negotiator": "~0.6.4", + "on-headers": "~1.0.2", + "safe-buffer": "5.2.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/computed-style-to-inline-style": { + "version": "3.0.0", + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "license": "MIT" + }, + "node_modules/concat-stream": { + "version": "1.6.2", + "engines": [ + "node >= 0.8" + ], + "license": "MIT", + "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", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/console-browserify": { + "version": "1.2.0" + }, + "node_modules/constants-browserify": { + "version": "1.0.0", + "license": "MIT" + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type-parser": { + "version": "1.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "license": "MIT" + }, + "node_modules/cookie": { + "version": "0.7.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "dev": true, + "license": "MIT" + }, + "node_modules/copy-concurrently": { + "version": "1.0.5", + "license": "ISC", + "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-concurrently/node_modules/mkdirp": { + "version": "0.5.6", + "license": "MIT", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/copy-descriptor": { + "version": "0.1.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/copy-webpack-plugin": { + "version": "6.4.1", + "license": "MIT", + "dependencies": { + "cacache": "^15.0.5", + "fast-glob": "^3.2.4", + "find-cache-dir": "^3.3.1", + "glob-parent": "^5.1.1", + "globby": "^11.0.1", + "loader-utils": "^2.0.0", + "normalize-path": "^3.0.0", + "p-limit": "^3.0.2", + "schema-utils": "^3.0.0", + "serialize-javascript": "^5.0.1", + "webpack-sources": "^1.4.3" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.37.0 || ^5.0.0" + } + }, + "node_modules/copy-webpack-plugin/node_modules/loader-utils": { + "version": "2.0.4", + "license": "MIT", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/copy-webpack-plugin/node_modules/schema-utils": { + "version": "3.3.0", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/copy-webpack-plugin/node_modules/source-map": { + "version": "0.6.1", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/copy-webpack-plugin/node_modules/webpack-sources": { + "version": "1.4.3", + "license": "MIT", + "dependencies": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + } + }, + "node_modules/core-js": { + "version": "2.5.7", + "license": "MIT" + }, + "node_modules/core-js-compat": { + "version": "3.43.0", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.25.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "license": "MIT" + }, + "node_modules/cosmiconfig": { + "version": "5.2.1", + "license": "MIT", + "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", + "license": "MIT", + "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", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/create-ecdh": { + "version": "4.0.4", + "license": "MIT", + "dependencies": { + "bn.js": "^4.1.0", + "elliptic": "^6.5.3" + } + }, + "node_modules/create-ecdh/node_modules/bn.js": { + "version": "4.12.2", + "license": "MIT" + }, + "node_modules/create-hash": { + "version": "1.2.0", + "license": "MIT", + "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", + "license": "MIT", + "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-env": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", + "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.1" + }, + "bin": { + "cross-env": "src/bin/cross-env.js", + "cross-env-shell": "src/bin/cross-env-shell.js" + }, + "engines": { + "node": ">=10.14", + "npm": ">=6", + "yarn": ">=1" + } + }, + "node_modules/cross-env/node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cross-env/node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cross-env/node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cross-env/node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cross-env/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cross-spawn": { + "version": "6.0.6", + "dev": true, + "license": "MIT", + "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.2", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/crypto-browserify": { + "version": "3.12.1", + "license": "MIT", + "dependencies": { + "browserify-cipher": "^1.0.1", + "browserify-sign": "^4.2.3", + "create-ecdh": "^4.0.4", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "diffie-hellman": "^5.0.3", + "hash-base": "~3.0.4", + "inherits": "^2.0.4", + "pbkdf2": "^3.1.2", + "public-encrypt": "^4.0.3", + "randombytes": "^2.1.0", + "randomfill": "^1.0.4" + }, + "engines": { + "node": ">= 0.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/css-loader": { + "version": "1.0.1", + "license": "MIT", + "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/ansi-styles": { + "version": "3.2.1", + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/css-loader/node_modules/chalk": { + "version": "2.4.2", + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/css-loader/node_modules/color-convert": { + "version": "1.9.3", + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/css-loader/node_modules/postcss": { + "version": "6.0.23", + "license": "MIT", + "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", + "license": "MIT" + }, + "node_modules/css-loader/node_modules/source-map": { + "version": "0.6.1", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/css-loader/node_modules/supports-color": { + "version": "5.5.0", + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/css-mediaquery": { + "version": "0.1.2", + "license": "BSD" + }, + "node_modules/css-select": { + "version": "5.2.2", + "dev": true, + "license": "BSD-2-Clause", + "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", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "fastparse": "^1.1.2" + } + }, + "node_modules/css-vendor": { + "version": "0.3.8", + "license": "MIT", + "dependencies": { + "is-in-browser": "^1.0.2" + } + }, + "node_modules/css-what": { + "version": "6.2.2", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssom": { + "version": "0.3.8", + "dev": true, + "license": "MIT" + }, + "node_modules/cssstyle": { + "version": "0.2.37", + "dev": true, + "license": "MIT", + "dependencies": { + "cssom": "0.3.x" + } + }, + "node_modules/cyclist": { + "version": "1.0.2", + "license": "MIT" + }, + "node_modules/dashdash": { + "version": "1.14.1", + "license": "MIT", + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/data-view-buffer": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/inspect-js" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/debug": { + "version": "4.4.1", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decimal.js": { + "version": "10.5.0", + "license": "MIT" + }, + "node_modules/decode-html": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/decode-uri-component": { + "version": "0.2.2", + "license": "MIT", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/decompress": { + "version": "4.2.1", + "license": "MIT", + "dependencies": { + "decompress-tar": "^4.0.0", + "decompress-tarbz2": "^4.0.0", + "decompress-targz": "^4.0.0", + "decompress-unzip": "^4.0.1", + "graceful-fs": "^4.1.10", + "make-dir": "^1.0.0", + "pify": "^2.3.0", + "strip-dirs": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/decompress-response": { + "version": "3.3.0", + "license": "MIT", + "dependencies": { + "mimic-response": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/decompress-tar": { + "version": "4.1.1", + "license": "MIT", + "dependencies": { + "file-type": "^5.2.0", + "is-stream": "^1.1.0", + "tar-stream": "^1.5.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/decompress-tar/node_modules/file-type": { + "version": "5.2.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/decompress-tarbz2": { + "version": "4.1.1", + "license": "MIT", + "dependencies": { + "decompress-tar": "^4.1.0", + "file-type": "^6.1.0", + "is-stream": "^1.1.0", + "seek-bzip": "^1.0.5", + "unbzip2-stream": "^1.0.9" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/decompress-tarbz2/node_modules/file-type": { + "version": "6.2.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/decompress-targz": { + "version": "4.1.1", + "license": "MIT", + "dependencies": { + "decompress-tar": "^4.1.1", + "file-type": "^5.2.0", + "is-stream": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/decompress-targz/node_modules/file-type": { + "version": "5.2.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/decompress-unzip": { + "version": "4.0.1", + "license": "MIT", + "dependencies": { + "file-type": "^3.8.0", + "get-stream": "^2.2.0", + "pify": "^2.3.0", + "yauzl": "^2.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/decompress-unzip/node_modules/file-type": { + "version": "3.9.0", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decompress-unzip/node_modules/get-stream": { + "version": "2.3.1", + "license": "MIT", + "dependencies": { + "object-assign": "^4.0.1", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decompress-unzip/node_modules/pify": { + "version": "2.3.0", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decompress/node_modules/make-dir": { + "version": "1.3.0", + "license": "MIT", + "dependencies": { + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/decompress/node_modules/make-dir/node_modules/pify": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/decompress/node_modules/pify": { + "version": "2.3.0", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/deep-equal": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arguments": "^1.1.1", + "is-date-object": "^1.0.5", + "is-regex": "^1.1.4", + "object-is": "^1.1.5", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.5.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "license": "MIT" + }, + "node_modules/default-gateway": { + "version": "4.2.0", + "dev": true, + "license": "BSD-2-Clause", + "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", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/default-require-extensions": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "strip-bom": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "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", + "license": "MIT", + "dependencies": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/del": { + "version": "6.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "globby": "^11.0.1", + "graceful-fs": "^4.2.4", + "is-glob": "^4.0.1", + "is-path-cwd": "^2.2.0", + "is-path-inside": "^3.0.2", + "p-map": "^4.0.0", + "rimraf": "^3.0.2", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/del/node_modules/rimraf": { + "version": "3.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/del/node_modules/slash": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/des.js": { + "version": "1.1.0", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-file": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/detect-indent": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "repeating": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/diff": { + "version": "3.5.0", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/diff-match-patch": { + "version": "1.0.4", + "license": "Apache-2.0" + }, + "node_modules/diffie-hellman": { + "version": "5.0.3", + "license": "MIT", + "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.2", + "license": "MIT" + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "license": "MIT", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/discontinuous-range": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/dns-equal": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/dns-packet": { + "version": "1.3.4", + "dev": true, + "license": "MIT", + "dependencies": { + "ip": "^1.1.0", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/dns-txt": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-indexof": "^1.0.0" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dom-converter": { + "version": "0.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "utila": "~0.4" + } + }, + "node_modules/dom-helpers": { + "version": "3.4.0", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.1.2" + } + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "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" + }, + "node_modules/domain-browser": { + "version": "1.2.0", + "license": "MIT", + "engines": { + "node": ">=0.4", + "npm": ">=1.2" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domhandler": { + "version": "5.0.3", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/dompurify": { + "version": "2.5.8", + "license": "(MPL-2.0 OR Apache-2.0)" + }, + "node_modules/domutils": { + "version": "3.2.2", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dot-case": { + "version": "3.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/download": { + "version": "8.0.0", + "license": "MIT", + "dependencies": { + "archive-type": "^4.0.0", + "content-disposition": "^0.5.2", + "decompress": "^4.2.1", + "ext-name": "^5.0.0", + "file-type": "^11.1.0", + "filenamify": "^3.0.0", + "get-stream": "^4.1.0", + "got": "^8.3.1", + "make-dir": "^2.1.0", + "p-event": "^2.1.0", + "pify": "^4.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/duplexer2": { + "version": "0.1.4", + "license": "BSD-3-Clause", + "dependencies": { + "readable-stream": "^2.0.2" + } + }, + "node_modules/duplexer3": { + "version": "0.1.5", + "license": "BSD-3-Clause" + }, + "node_modules/duplexify": { + "version": "3.7.1", + "license": "MIT", + "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", + "license": "MIT", + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.179", + "license": "ISC" + }, + "node_modules/elliptic": { + "version": "6.6.1", + "license": "MIT", + "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.2", + "license": "MIT" + }, + "node_modules/email-addresses": { + "version": "3.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/emoji-regex": { + "version": "7.0.3", + "dev": true, + "license": "MIT" + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/encoding": { + "version": "0.1.13", + "dev": true, + "license": "MIT", + "dependencies": { + "iconv-lite": "^0.6.2" + } + }, + "node_modules/encoding-sniffer": { + "version": "0.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "iconv-lite": "^0.6.3", + "whatwg-encoding": "^3.1.1" + }, + "funding": { + "url": "https://github.com/fb55/encoding-sniffer?sponsor=1" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.5", + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/enhanced-resolve": { + "version": "0.9.1", + "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.5.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/enzyme": { + "version": "3.10.0", + "dev": true, + "license": "MIT", + "dependencies": { + "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" + } + }, + "node_modules/enzyme-adapter-react-16": { + "version": "1.3.0", + "dev": true, + "license": "MIT", + "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.2", + "dev": true, + "license": "MIT", + "dependencies": { + "airbnb-prop-types": "^2.16.0", + "function.prototype.name": "^1.1.6", + "hasown": "^2.0.0", + "object.assign": "^4.1.5", + "object.fromentries": "^2.0.7", + "prop-types": "^15.8.1", + "semver": "^6.3.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/errno": { + "version": "0.1.8", + "license": "MIT", + "dependencies": { + "prr": "~1.0.1" + }, + "bin": { + "errno": "cli.js" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "dev": true + }, + "node_modules/es-array-method-boxes-properly": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-to-primitive": { + "version": "1.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es6-object-assign": { + "version": "1.1.0", + "license": "MIT" + }, + "node_modules/es6-promise": { + "version": "3.0.2", + "license": "MIT" + }, + "node_modules/escalade": { + "version": "3.2.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "dev": true, + "license": "MIT" + }, + "node_modules/escape-latex": { + "version": "1.2.0", + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/escodegen": { + "version": "1.14.3", + "dev": true, + "license": "BSD-2-Clause", + "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/source-map": { + "version": "0.6.1", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint": { + "version": "5.16.0", + "dev": true, + "license": "MIT", + "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": "6.0.0", + "dev": true, + "license": "BSD-3-Clause", + "optionalDependencies": { + "eslint-plugin-react": ">=7.14.2" + }, + "peerDependencies": { + "babel-eslint": ">=8.0.1", + "eslint": ">=5.3.0" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-import-resolver-webpack": { + "version": "0.11.1", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/eslint-import-resolver-webpack/node_modules/ms": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/eslint-import-resolver-webpack/node_modules/semver": { + "version": "5.7.2", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.12.1", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.23.4", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.3", + "array.prototype.flat": "^1.2.4", + "debug": "^2.6.9", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.4", + "eslint-module-utils": "^2.6.1", + "find-up": "^2.0.0", + "has": "^1.0.3", + "is-core-module": "^2.4.0", + "minimatch": "^3.0.4", + "object.values": "^1.1.3", + "pkg-up": "^2.0.0", + "read-pkg-up": "^3.0.0", + "resolve": "^1.20.0", + "tsconfig-paths": "^3.9.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "2.6.9", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/ms": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/eslint-plugin-jest": { + "version": "22.17.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/experimental-utils": "^1.13.0" + }, + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "eslint": ">=5" + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.24.0", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.3", + "array.prototype.flatmap": "^1.2.4", + "doctrine": "^2.1.0", + "has": "^1.0.3", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.0.4", + "object.entries": "^1.1.4", + "object.fromentries": "^2.0.4", + "object.values": "^1.1.4", + "prop-types": "^15.7.2", + "resolve": "^2.0.0-next.3", + "string.prototype.matchall": "^4.0.5" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7" + } + }, + "node_modules/eslint-plugin-react/node_modules/doctrine": { + "version": "2.1.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.5", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.13.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", + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/eslint-utils": { + "version": "1.4.3", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint/node_modules/ansi-regex": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint/node_modules/ansi-styles": { + "version": "3.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint/node_modules/chalk": { + "version": "2.4.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint/node_modules/color-convert": { + "version": "1.9.3", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/eslint/node_modules/mkdirp": { + "version": "0.5.6", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/eslint/node_modules/semver": { + "version": "5.7.2", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/eslint/node_modules/strip-ansi": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint/node_modules/supports-color": { + "version": "5.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/espree": { + "version": "5.0.1", + "dev": true, + "license": "BSD-2-Clause", + "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", + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esquery/node_modules/estraverse": { + "version": "5.3.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "dev": true, + "license": "MIT" + }, + "node_modules/events": { + "version": "3.3.0", + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/eventsource": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/evp_bytestokey": { + "version": "1.0.3", + "license": "MIT", + "dependencies": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/exec-sh": { + "version": "0.2.2", + "dev": true, + "license": "MIT", + "dependencies": { + "merge": "^1.2.0" + } + }, + "node_modules/execa": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "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", + "license": "BSD-3-Clause" + }, + "node_modules/expand-brackets": { + "version": "2.1.4", + "license": "MIT", + "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/expand-brackets/node_modules/debug": { + "version": "2.6.9", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/expand-brackets/node_modules/define-property": { + "version": "0.2.5", + "license": "MIT", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-descriptor": { + "version": "0.1.7", + "license": "MIT", + "dependencies": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/expand-brackets/node_modules/ms": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/expand-range": { + "version": "1.8.2", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-range/node_modules/fill-range": { + "version": "2.2.4", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-range/node_modules/isarray": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/expand-range/node_modules/isobject": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "isarray": "1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-tilde": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "homedir-polyfill": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expect": { + "version": "21.2.1", + "dev": true, + "license": "MIT", + "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/expect/node_modules/ansi-styles": { + "version": "3.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/expect/node_modules/color-convert": { + "version": "1.9.3", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/express": { + "version": "4.21.2", + "dev": true, + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.3", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.7.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.3.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.12", + "proxy-addr": "~2.0.7", + "qs": "6.13.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.19.0", + "serve-static": "1.16.2", + "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" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express/node_modules/array-flatten": { + "version": "1.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/express/node_modules/qs": { + "version": "6.13.0", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ext-list": { + "version": "2.2.2", + "license": "MIT", + "dependencies": { + "mime-db": "^1.28.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ext-name": { + "version": "5.0.0", + "license": "MIT", + "dependencies": { + "ext-list": "^2.0.0", + "sort-keys-length": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "license": "MIT" + }, + "node_modules/extend-shallow": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/external-editor": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/external-editor/node_modules/iconv-lite": { + "version": "0.4.24", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob": { + "version": "2.0.4", + "license": "MIT", + "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/extglob/node_modules/define-property": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extract-zip": { + "version": "2.0.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + }, + "engines": { + "node": ">= 10.17.0" + }, + "optionalDependencies": { + "@types/yauzl": "^2.9.1" + } + }, + "node_modules/extract-zip/node_modules/get-stream": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/extsprintf": { + "version": "1.3.0", + "engines": [ + "node >=0.6.0" + ], + "license": "MIT" + }, + "node_modules/falafel": { + "version": "2.2.5", + "license": "MIT", + "dependencies": { + "acorn": "^7.1.1", + "isarray": "^2.0.1" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/falafel/node_modules/acorn": { + "version": "7.4.1", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/braces": { + "version": "3.0.3", + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fast-glob/node_modules/fill-range": { + "version": "7.1.1", + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fast-glob/node_modules/is-number": { + "version": "7.0.0", + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/fast-glob/node_modules/micromatch": { + "version": "4.0.8", + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/fast-glob/node_modules/to-regex-range": { + "version": "5.0.1", + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "license": "MIT" + }, + "node_modules/fastestsmallesttextencoderdecoder": { + "version": "1.0.22", + "license": "CC0-1.0" + }, + "node_modules/fastparse": { + "version": "1.1.2", + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.19.1", + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/fbjs": { + "version": "0.8.18", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "MIT" + }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "license": "MIT", + "dependencies": { + "pend": "~1.2.0" + } + }, + "node_modules/figgy-pudding": { + "version": "3.5.2", + "license": "ISC" + }, + "node_modules/figures": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/file-entry-cache": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/file-loader": { + "version": "2.0.0", + "license": "MIT", + "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", + "license": "MIT", + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/file-type": { + "version": "11.1.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/file-uri-to-path": { + "version": "1.0.0", + "license": "MIT", + "optional": true + }, + "node_modules/filename-regex": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/filename-reserved-regex": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/filenamify": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "filename-reserved-regex": "^2.0.0", + "strip-outer": "^1.0.0", + "trim-repeated": "^1.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/fileset": { + "version": "2.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "glob": "^7.0.3", + "minimatch": "^3.0.3" + } + }, + "node_modules/fill-range": { + "version": "4.0.0", + "license": "MIT", + "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/finalhandler": { + "version": "1.3.1", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "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", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/find-cache-dir": { + "version": "3.3.2", + "license": "MIT", + "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", + "license": "MIT", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-root": { + "version": "1.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/find-up": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/findup": { + "version": "0.1.5", + "dependencies": { + "colors": "~0.6.0-1", + "commander": "~2.1.0" + }, + "bin": { + "findup": "bin/findup.js" + }, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/findup-sync": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "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/node_modules/commander": { + "version": "2.1.0", + "engines": { + "node": ">= 0.6.x" + } + }, + "node_modules/flat-cache": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/flatted": { + "version": "2.0.2", + "dev": true, + "license": "ISC" + }, + "node_modules/flush-write-stream": { + "version": "1.1.1", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.9", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-each": { + "version": "0.3.5", + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/for-in": { + "version": "1.0.2", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/for-own": { + "version": "0.1.5", + "dev": true, + "license": "MIT", + "dependencies": { + "for-in": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/forever-agent": { + "version": "0.6.1", + "license": "Apache-2.0", + "engines": { + "node": "*" + } + }, + "node_modules/form-data": { + "version": "4.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/format-message": { + "version": "6.2.1", + "license": "MIT", + "dependencies": { + "format-message-formats": "^6.2.0", + "format-message-interpret": "^6.2.0", + "format-message-parse": "^6.2.0", + "lookup-closest-locale": "^6.2.0" + } + }, + "node_modules/format-message-formats": { + "version": "6.2.4", + "license": "MIT" + }, + "node_modules/format-message-interpret": { + "version": "6.2.4", + "license": "MIT", + "dependencies": { + "format-message-formats": "^6.2.4", + "lookup-closest-locale": "^6.2.0" + } + }, + "node_modules/format-message-parse": { + "version": "6.2.4", + "license": "MIT" + }, + "node_modules/forwarded": { + "version": "0.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fraction.js": { + "version": "4.3.4", + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fragment-cache": { + "version": "0.2.1", + "license": "MIT", + "dependencies": { + "map-cache": "^0.2.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/from2": { + "version": "2.3.0", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "node_modules/from2-array": { + "version": "0.0.4", + "license": "MIT", + "dependencies": { + "from2": "^2.0.3" + } + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "license": "MIT" + }, + "node_modules/fs-extra": { + "version": "8.1.0", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-readdir-recursive": { + "version": "1.1.0", + "license": "MIT" + }, + "node_modules/fs-write-stream-atomic": { + "version": "1.0.10", + "license": "ISC", + "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", + "license": "ISC" + }, + "node_modules/function-bind": { + "version": "1.1.2", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.8", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "functions-have-names": "^1.2.3", + "hasown": "^2.0.2", + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functional-red-black-tree": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "1.0.3", + "dev": true, + "license": "ISC" + }, + "node_modules/get-float-time-domain-data": { + "version": "0.1.0", + "license": "MIT" + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-stream": { + "version": "4.1.0", + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/get-symbol-description": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-user-media-promise": { + "version": "1.1.4", + "license": "Apache-2.0" + }, + "node_modules/get-value": { + "version": "2.0.6", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/getpass": { + "version": "0.1.7", + "license": "MIT", + "dependencies": { + "assert-plus": "^1.0.0" + } + }, + "node_modules/gh-pages": { + "version": "3.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "async": "^2.6.1", + "commander": "^2.18.0", + "email-addresses": "^3.0.1", + "filenamify": "^4.3.0", + "find-cache-dir": "^3.3.1", + "fs-extra": "^8.1.0", + "globby": "^6.1.0" + }, + "bin": { + "gh-pages": "bin/gh-pages.js", + "gh-pages-clean": "bin/gh-pages-clean.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/gh-pages/node_modules/array-union": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "array-uniq": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gh-pages/node_modules/commander": { + "version": "2.20.3", + "dev": true, + "license": "MIT" + }, + "node_modules/gh-pages/node_modules/filenamify": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "filename-reserved-regex": "^2.0.0", + "strip-outer": "^1.0.1", + "trim-repeated": "^1.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gh-pages/node_modules/globby": { + "version": "6.1.0", + "dev": true, + "license": "MIT", + "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/pify": { + "version": "2.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "license": "ISC", + "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", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^2.0.0" + } + }, + "node_modules/glob-base/node_modules/is-extglob": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-base/node_modules/is-glob": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/global": { + "version": "4.3.2", + "license": "MIT", + "dependencies": { + "min-document": "^2.19.0", + "process": "~0.5.1" + } + }, + "node_modules/global-modules": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "global-prefix": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/global/node_modules/process": { + "version": "0.5.2", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "license": "MIT", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby/node_modules/ignore": { + "version": "5.3.2", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/globby/node_modules/slash": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/got": { + "version": "8.3.2", + "license": "MIT", + "dependencies": { + "@sindresorhus/is": "^0.7.0", + "cacheable-request": "^2.1.1", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^3.0.0", + "into-stream": "^3.1.0", + "is-retry-allowed": "^1.1.0", + "isurl": "^1.0.0-alpha5", + "lowercase-keys": "^1.0.0", + "mimic-response": "^1.0.0", + "p-cancelable": "^0.4.0", + "p-timeout": "^2.0.1", + "pify": "^3.0.0", + "safe-buffer": "^5.1.1", + "timed-out": "^4.0.1", + "url-parse-lax": "^3.0.0", + "url-to-options": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/got/node_modules/get-stream": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/got/node_modules/pify": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "license": "ISC" + }, + "node_modules/grapheme-breaker": { + "version": "0.3.2", + "license": "MIT", + "dependencies": { + "brfs": "^1.2.0", + "unicode-trie": "^0.3.1" + } + }, + "node_modules/growl": { + "version": "1.10.3", + "license": "MIT", + "engines": { + "node": ">=4.x" + } + }, + "node_modules/growly": { + "version": "1.3.0", + "dev": true, + "license": "MIT" + }, + "node_modules/handle-thing": { + "version": "2.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/handlebars": { + "version": "4.7.8", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.2", + "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/handlebars/node_modules/source-map": { + "version": "0.6.1", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/har-schema": { + "version": "2.0.0", + "license": "ISC", + "engines": { + "node": ">=4" + } + }, + "node_modules/har-validator": { + "version": "5.1.5", + "license": "MIT", + "dependencies": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/has": { + "version": "1.0.4", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-ansi": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-bigints": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbol-support-x": { + "version": "1.4.2", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-to-string-tag-x": { + "version": "1.4.1", + "license": "MIT", + "dependencies": { + "has-symbol-support-x": "^1.4.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-value": { + "version": "1.0.0", + "license": "MIT", + "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", + "license": "MIT", + "dependencies": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/kind-of": { + "version": "4.0.0", + "license": "MIT", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/hash-base": { + "version": "3.0.5", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.4", + "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/hash.js": { + "version": "1.1.7", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/he": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/heap": { + "version": "0.2.5" + }, + "node_modules/hmac-drbg": { + "version": "1.0.1", + "license": "MIT", + "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", + "license": "BSD-3-Clause", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/home-or-tmp": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/homedir-polyfill": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "parse-passwd": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/hosted-git-info": { + "version": "2.8.9", + "license": "ISC" + }, + "node_modules/hpack.js": { + "version": "2.1.6", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-encoding": "^1.0.1" + } + }, + "node_modules/html-encoding-sniffer/node_modules/iconv-lite": { + "version": "0.4.24", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/html-encoding-sniffer/node_modules/whatwg-encoding": { + "version": "1.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "iconv-lite": "0.4.24" + } + }, + "node_modules/html-entities": { + "version": "1.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/html-minifier-terser": { + "version": "5.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "camel-case": "^4.1.1", + "clean-css": "^4.2.3", + "commander": "^4.1.1", + "he": "^1.2.0", + "param-case": "^3.0.3", + "relateurl": "^0.2.7", + "terser": "^4.6.3" + }, + "bin": { + "html-minifier-terser": "cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/html-webpack-plugin": { + "version": "4.5.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/html-minifier-terser": "^5.0.0", + "@types/tapable": "^1.0.5", + "@types/webpack": "^4.41.8", + "html-minifier-terser": "^5.0.1", + "loader-utils": "^1.2.3", + "lodash": "^4.17.20", + "pretty-error": "^2.1.1", + "tapable": "^1.1.3", + "util.promisify": "1.0.0" + }, + "engines": { + "node": ">=6.9" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/html-webpack-plugin/node_modules/tapable": { + "version": "1.1.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/htmlparser2": { + "version": "10.0.0", + "dev": true, + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.2.1", + "entities": "^6.0.0" + } + }, + "node_modules/htmlparser2/node_modules/entities": { + "version": "6.0.1", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/http-cache-semantics": { + "version": "3.8.1", + "license": "BSD-2-Clause" + }, + "node_modules/http-deceiver": { + "version": "1.2.7", + "dev": true, + "license": "MIT" + }, + "node_modules/http-errors": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "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.10", + "dev": true, + "license": "MIT" + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "MIT", + "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-signature": { + "version": "1.2.0", + "license": "MIT", + "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", + "license": "MIT" + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/hull.js": { + "version": "0.2.10", + "license": "BSD" + }, + "node_modules/hyphenate-style-name": { + "version": "1.1.0", + "license": "BSD-3-Clause" + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/icss-replace-symbols": { + "version": "1.1.0", + "license": "ISC" + }, + "node_modules/icss-utils": { + "version": "2.1.0", + "license": "ISC", + "dependencies": { + "postcss": "^6.0.1" + } + }, + "node_modules/icss-utils/node_modules/ansi-styles": { + "version": "3.2.1", + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/icss-utils/node_modules/chalk": { + "version": "2.4.2", + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/icss-utils/node_modules/color-convert": { + "version": "1.9.3", + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/icss-utils/node_modules/postcss": { + "version": "6.0.23", + "license": "MIT", + "dependencies": { + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/icss-utils/node_modules/source-map": { + "version": "0.6.1", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/icss-utils/node_modules/supports-color": { + "version": "5.5.0", + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/iferr": { + "version": "0.1.5", + "license": "MIT" + }, + "node_modules/ify-loader": { + "version": "1.0.4", + "license": "MIT", + "dependencies": { + "bl": "^1.0.0", + "findup": "^0.1.5", + "from2-array": "0.0.4", + "map-limit": "0.0.1", + "multipipe": "^0.3.0", + "read-package-json": "^2.0.2", + "resolve": "^1.1.6" + } + }, + "node_modules/ignore": { + "version": "4.0.6", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/immediate": { + "version": "3.0.6", + "license": "MIT" + }, + "node_modules/immutable": { + "version": "3.8.2", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/import-cwd": { + "version": "2.1.0", + "license": "MIT", + "dependencies": { + "import-from": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "dev": true, + "license": "MIT", + "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", + "license": "MIT", + "dependencies": { + "resolve-from": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/import-from/node_modules/resolve-from": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/import-local": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/import-local/node_modules/locate-path": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/import-local/node_modules/pkg-dir": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/infer-owner": { + "version": "1.0.4", + "license": "ISC" + }, + "node_modules/inflight": { + "version": "1.0.6", + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "license": "ISC" + }, + "node_modules/ini": { + "version": "1.3.8", + "dev": true, + "license": "ISC" + }, + "node_modules/inquirer": { + "version": "6.5.2", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/inquirer/node_modules/ansi-styles": { + "version": "3.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer/node_modules/chalk": { + "version": "2.4.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer/node_modules/color-convert": { + "version": "1.9.3", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/inquirer/node_modules/strip-ansi": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/inquirer/node_modules/supports-color": { + "version": "5.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/internal-ip": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "default-gateway": "^4.2.0", + "ipaddr.js": "^1.9.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/internal-slot": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/interpret": { + "version": "1.4.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/intl": { + "version": "1.2.5", + "license": "MIT" + }, + "node_modules/intl-format-cache": { + "version": "2.2.9", + "license": "BSD-3-Clause" + }, + "node_modules/intl-messageformat": { + "version": "2.2.0", + "license": "BSD-3-Clause", + "dependencies": { + "intl-messageformat-parser": "1.4.0" + } + }, + "node_modules/intl-messageformat-parser": { + "version": "1.8.1", + "license": "BSD-3-Clause" + }, + "node_modules/intl-messageformat/node_modules/intl-messageformat-parser": { + "version": "1.4.0", + "license": "BSD-3-Clause" + }, + "node_modules/intl-relativeformat": { + "version": "2.2.0", + "license": "BSD-3-Clause", + "dependencies": { + "intl-messageformat": "^2.0.0" + } + }, + "node_modules/into-stream": { + "version": "3.1.0", + "license": "MIT", + "dependencies": { + "from2": "^2.1.1", + "p-is-promise": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/invariant": { + "version": "2.2.4", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "node_modules/invert-kv": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ip": { + "version": "1.1.9", + "dev": true, + "license": "MIT" + }, + "node_modules/ip-regex": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-absolute-url": { + "version": "3.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-accessor-descriptor": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-arguments": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "license": "MIT" + }, + "node_modules/is-async-function": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "async-function": "^1.0.0", + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-binary-path": { + "version": "1.0.1", + "devOptional": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-boolean-object": { + "version": "1.2.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-buffer": { + "version": "1.1.6", + "license": "MIT" + }, + "node_modules/is-builtin-module": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "builtin-modules": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-ci": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ci-info": "^1.5.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-descriptor": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-data-view": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-descriptor": { + "version": "1.0.3", + "license": "MIT", + "dependencies": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-directory": { + "version": "0.3.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-dotfile": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-equal-shallow": { + "version": "0.1.3", + "dev": true, + "license": "MIT", + "dependencies": { + "is-primitive": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extendable": { + "version": "0.1.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-finite": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/is-function": { + "version": "1.0.2", + "license": "MIT" + }, + "node_modules/is-generator-function": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-proto": "^1.0.0", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-in-browser": { + "version": "1.1.3", + "license": "MIT" + }, + "node_modules/is-map": { + "version": "2.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-natural-number": { + "version": "4.0.1", + "license": "MIT" + }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number-object": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-object": { + "version": "1.0.2", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-path-cwd": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-path-in-cwd": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "is-path-inside": "^2.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-path-in-cwd/node_modules/is-path-inside": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "path-is-inside": "^1.0.2" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "1.1.0", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-posix-bracket": { + "version": "0.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-primitive": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-regex": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-retry-allowed": { + "version": "1.2.0", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "1.1.0", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-string": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-subset": { + "version": "0.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/is-symbol": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "license": "MIT" + }, + "node_modules/is-url": { + "version": "1.2.4", + "dev": true, + "license": "MIT" + }, + "node_modules/is-utf8": { + "version": "0.2.1", + "dev": true, + "license": "MIT" + }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-windows": { + "version": "1.0.2", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-wsl": { + "version": "1.1.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/is2": { + "version": "2.0.9", + "dev": true, + "license": "MIT", + "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": "2.0.5", + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/isobject": { + "version": "3.0.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isomorphic-fetch": { + "version": "2.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "node-fetch": "^1.0.1", + "whatwg-fetch": ">=0.10.0" + } + }, + "node_modules/isstream": { + "version": "0.1.2", + "license": "MIT" + }, + "node_modules/istanbul-api": { + "version": "1.3.7", + "dev": true, + "license": "BSD-3-Clause", + "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/mkdirp": { + "version": "0.5.6", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/istanbul-lib-coverage": { + "version": "1.2.1", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/istanbul-lib-hook": { + "version": "1.2.2", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "append-transform": "^0.4.0" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "1.10.2", + "dev": true, + "license": "BSD-3-Clause", + "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.2", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/istanbul-lib-report": { + "version": "1.1.5", + "dev": true, + "license": "BSD-3-Clause", + "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", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/istanbul-lib-report/node_modules/mkdirp": { + "version": "0.5.6", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/istanbul-lib-report/node_modules/supports-color": { + "version": "3.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^1.0.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "1.2.6", + "dev": true, + "license": "BSD-3-Clause", + "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", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/istanbul-lib-source-maps/node_modules/mkdirp": { + "version": "0.5.6", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/istanbul-reports": { + "version": "1.5.1", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "handlebars": "^4.0.3" + } + }, + "node_modules/isurl": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "has-to-string-tag-x": "^1.2.0", + "is-object": "^1.0.1" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/javascript-natural-sort": { + "version": "0.7.1", + "license": "MIT" + }, + "node_modules/jest": { + "version": "21.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-cli": "^21.2.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/jest-changed-files": { + "version": "21.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "throat": "^4.0.0" + } + }, + "node_modules/jest-cli": { + "version": "21.2.1", + "dev": true, + "license": "MIT", + "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/ansi-regex": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/jest-cli/node_modules/ansi-styles": { + "version": "3.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/jest-cli/node_modules/arr-diff": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "arr-flatten": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-cli/node_modules/array-unique": { + "version": "0.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-cli/node_modules/braces": { + "version": "1.8.5", + "dev": true, + "license": "MIT", + "dependencies": { + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-cli/node_modules/chalk": { + "version": "2.4.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/jest-cli/node_modules/color-convert": { + "version": "1.9.3", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/jest-cli/node_modules/expand-brackets": { + "version": "0.1.5", + "dev": true, + "license": "MIT", + "dependencies": { + "is-posix-bracket": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-cli/node_modules/extglob": { + "version": "0.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-cli/node_modules/is-extglob": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-cli/node_modules/is-glob": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-cli/node_modules/micromatch": { + "version": "2.3.11", + "dev": true, + "license": "MIT", + "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/jest-cli/node_modules/normalize-path": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-cli/node_modules/pify": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/jest-cli/node_modules/slash": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-cli/node_modules/strip-ansi": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/jest-cli/node_modules/supports-color": { + "version": "5.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/jest-config": { + "version": "21.2.1", + "dev": true, + "license": "MIT", + "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-config/node_modules/ansi-styles": { + "version": "3.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/jest-config/node_modules/chalk": { + "version": "2.4.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/jest-config/node_modules/color-convert": { + "version": "1.9.3", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/jest-config/node_modules/supports-color": { + "version": "5.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/jest-diff": { + "version": "21.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^2.0.1", + "diff": "^3.2.0", + "jest-get-type": "^21.2.0", + "pretty-format": "^21.2.1" + } + }, + "node_modules/jest-diff/node_modules/ansi-styles": { + "version": "3.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/jest-diff/node_modules/chalk": { + "version": "2.4.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/jest-diff/node_modules/color-convert": { + "version": "1.9.3", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/jest-diff/node_modules/supports-color": { + "version": "5.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/jest-docblock": { + "version": "21.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-environment-jsdom": { + "version": "21.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-mock": "^21.2.0", + "jest-util": "^21.2.1", + "jsdom": "^9.12.0" + } + }, + "node_modules/jest-environment-node": { + "version": "21.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-mock": "^21.2.0", + "jest-util": "^21.2.1" + } + }, + "node_modules/jest-get-type": { + "version": "21.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-haste-map": { + "version": "21.2.0", + "dev": true, + "license": "MIT", + "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-haste-map/node_modules/arr-diff": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "arr-flatten": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-haste-map/node_modules/array-unique": { + "version": "0.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-haste-map/node_modules/braces": { + "version": "1.8.5", + "dev": true, + "license": "MIT", + "dependencies": { + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-haste-map/node_modules/expand-brackets": { + "version": "0.1.5", + "dev": true, + "license": "MIT", + "dependencies": { + "is-posix-bracket": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-haste-map/node_modules/extglob": { + "version": "0.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-haste-map/node_modules/is-extglob": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-haste-map/node_modules/is-glob": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-haste-map/node_modules/micromatch": { + "version": "2.3.11", + "dev": true, + "license": "MIT", + "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/jest-haste-map/node_modules/normalize-path": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-jasmine2": { + "version": "21.2.1", + "dev": true, + "license": "MIT", + "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-jasmine2/node_modules/ansi-styles": { + "version": "3.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/jest-jasmine2/node_modules/chalk": { + "version": "2.4.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/jest-jasmine2/node_modules/color-convert": { + "version": "1.9.3", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/jest-jasmine2/node_modules/p-cancelable": { + "version": "0.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/jest-jasmine2/node_modules/supports-color": { + "version": "5.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/jest-junit": { + "version": "7.0.0", + "dev": true, + "license": "Apache-2.0", + "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", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/jest-junit/node_modules/ansi-styles": { + "version": "3.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/jest-junit/node_modules/camelcase": { + "version": "5.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/jest-junit/node_modules/chalk": { + "version": "2.4.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/jest-junit/node_modules/color-convert": { + "version": "1.9.3", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/jest-junit/node_modules/jest-get-type": { + "version": "24.9.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/jest-junit/node_modules/jest-validate": { + "version": "24.9.0", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/jest-junit/node_modules/mkdirp": { + "version": "0.5.6", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/jest-junit/node_modules/pretty-format": { + "version": "24.9.0", + "dev": true, + "license": "MIT", + "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-junit/node_modules/strip-ansi": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/jest-junit/node_modules/strip-ansi/node_modules/ansi-regex": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/jest-junit/node_modules/supports-color": { + "version": "5.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/jest-matcher-utils": { + "version": "21.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^2.0.1", + "jest-get-type": "^21.2.0", + "pretty-format": "^21.2.1" + } + }, + "node_modules/jest-matcher-utils/node_modules/ansi-styles": { + "version": "3.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/jest-matcher-utils/node_modules/chalk": { + "version": "2.4.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/jest-matcher-utils/node_modules/color-convert": { + "version": "1.9.3", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/jest-matcher-utils/node_modules/supports-color": { + "version": "5.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/jest-message-util": { + "version": "21.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^2.0.1", + "micromatch": "^2.3.11", + "slash": "^1.0.0" + } + }, + "node_modules/jest-message-util/node_modules/ansi-styles": { + "version": "3.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/jest-message-util/node_modules/arr-diff": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "arr-flatten": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-message-util/node_modules/array-unique": { + "version": "0.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-message-util/node_modules/braces": { + "version": "1.8.5", + "dev": true, + "license": "MIT", + "dependencies": { + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-message-util/node_modules/chalk": { + "version": "2.4.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/jest-message-util/node_modules/color-convert": { + "version": "1.9.3", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/jest-message-util/node_modules/expand-brackets": { + "version": "0.1.5", + "dev": true, + "license": "MIT", + "dependencies": { + "is-posix-bracket": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-message-util/node_modules/extglob": { + "version": "0.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-message-util/node_modules/is-extglob": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-message-util/node_modules/is-glob": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-message-util/node_modules/micromatch": { + "version": "2.3.11", + "dev": true, + "license": "MIT", + "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/jest-message-util/node_modules/normalize-path": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-message-util/node_modules/slash": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-message-util/node_modules/supports-color": { + "version": "5.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/jest-mock": { + "version": "21.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-regex-util": { + "version": "21.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-resolve": { + "version": "21.2.0", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-regex-util": "^21.2.0" + } + }, + "node_modules/jest-resolve/node_modules/ansi-styles": { + "version": "3.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/jest-resolve/node_modules/chalk": { + "version": "2.4.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/jest-resolve/node_modules/color-convert": { + "version": "1.9.3", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/jest-resolve/node_modules/supports-color": { + "version": "5.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/jest-runner": { + "version": "21.2.1", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/jest-runtime": { + "version": "21.2.1", + "dev": true, + "license": "MIT", + "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/ansi-styles": { + "version": "3.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/jest-runtime/node_modules/arr-diff": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "arr-flatten": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-runtime/node_modules/array-unique": { + "version": "0.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-runtime/node_modules/babel-core": { + "version": "6.26.3", + "dev": true, + "license": "MIT", + "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/braces": { + "version": "1.8.5", + "dev": true, + "license": "MIT", + "dependencies": { + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-runtime/node_modules/chalk": { + "version": "2.4.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/jest-runtime/node_modules/color-convert": { + "version": "1.9.3", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/jest-runtime/node_modules/debug": { + "version": "2.6.9", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/jest-runtime/node_modules/expand-brackets": { + "version": "0.1.5", + "dev": true, + "license": "MIT", + "dependencies": { + "is-posix-bracket": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-runtime/node_modules/extglob": { + "version": "0.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-runtime/node_modules/is-extglob": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-runtime/node_modules/is-glob": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-runtime/node_modules/json5": { + "version": "0.5.1", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/jest-runtime/node_modules/micromatch": { + "version": "2.3.11", + "dev": true, + "license": "MIT", + "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/jest-runtime/node_modules/ms": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-runtime/node_modules/normalize-path": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-runtime/node_modules/slash": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-runtime/node_modules/strip-bom": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/jest-runtime/node_modules/supports-color": { + "version": "5.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/jest-snapshot": { + "version": "21.2.1", + "dev": true, + "license": "MIT", + "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-snapshot/node_modules/ansi-styles": { + "version": "3.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/jest-snapshot/node_modules/chalk": { + "version": "2.4.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/jest-snapshot/node_modules/color-convert": { + "version": "1.9.3", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/jest-snapshot/node_modules/mkdirp": { + "version": "0.5.6", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/jest-snapshot/node_modules/supports-color": { + "version": "5.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/jest-util": { + "version": "21.2.1", + "dev": true, + "license": "MIT", + "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-util/node_modules/ansi-styles": { + "version": "3.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/jest-util/node_modules/chalk": { + "version": "2.4.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/jest-util/node_modules/color-convert": { + "version": "1.9.3", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/jest-util/node_modules/mkdirp": { + "version": "0.5.6", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/jest-util/node_modules/supports-color": { + "version": "5.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/jest-validate": { + "version": "21.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^2.0.1", + "jest-get-type": "^21.2.0", + "leven": "^2.1.0", + "pretty-format": "^21.2.1" + } + }, + "node_modules/jest-validate/node_modules/ansi-styles": { + "version": "3.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/jest-validate/node_modules/chalk": { + "version": "2.4.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/jest-validate/node_modules/color-convert": { + "version": "1.9.3", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/jest-validate/node_modules/supports-color": { + "version": "5.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/js-base64": { + "version": "2.4.9", + "license": "BSD-3-Clause" + }, + "node_modules/js-md5": { + "version": "0.7.3", + "license": "MIT" + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsbn": { + "version": "0.1.1", + "license": "MIT" + }, + "node_modules/jsdom": { + "version": "9.12.0", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/jsdom/node_modules/iconv-lite": { + "version": "0.4.24", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jsdom/node_modules/parse5": { + "version": "1.5.1", + "dev": true + }, + "node_modules/jsdom/node_modules/whatwg-encoding": { + "version": "1.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "iconv-lite": "0.4.24" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.0", + "license": "MIT" + }, + "node_modules/json-parse-better-errors": { + "version": "1.0.2", + "license": "MIT" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "license": "MIT" + }, + "node_modules/json-schema": { + "version": "0.4.0", + "license": "(AFL-2.1 OR BSD-3-Clause)" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "license": "MIT" + }, + "node_modules/json-stable-stringify": { + "version": "1.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "isarray": "^2.0.5", + "jsonify": "^0.0.1", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "license": "ISC" + }, + "node_modules/json5": { + "version": "2.2.3", + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "4.0.0", + "license": "MIT", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonify": { + "version": "0.0.1", + "dev": true, + "license": "Public Domain", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/jsprim": { + "version": "1.4.2", + "license": "MIT", + "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.5", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/jszip": { + "version": "3.10.1", + "license": "(MIT OR GPL-3.0-or-later)", + "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" + }, + "node_modules/keyv": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.0" + } + }, + "node_modules/killable": { + "version": "1.0.1", + "dev": true, + "license": "ISC" + }, + "node_modules/kind-of": { + "version": "3.2.2", + "license": "MIT", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/lcid": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "invert-kv": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/leven": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/levn": { + "version": "0.3.0", + "license": "MIT", + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lie": { + "version": "3.3.0", + "license": "MIT", + "dependencies": { + "immediate": "~3.0.5" + } + }, + "node_modules/linebreak": { + "version": "0.3.0", + "license": "MIT", + "dependencies": { + "base64-js": "0.0.8", + "brfs": "^1.3.0", + "unicode-trie": "^0.3.0" + } + }, + "node_modules/linebreak/node_modules/base64-js": { + "version": "0.0.8", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/load-json-file": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/load-json-file/node_modules/pify": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/load-json-file/node_modules/strip-bom": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/loader-runner": { + "version": "2.4.0", + "license": "MIT", + "engines": { + "node": ">=4.3.0 <5.0.0 || >=5.10" + } + }, + "node_modules/loader-utils": { + "version": "1.4.2", + "license": "MIT", + "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.2", + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/localforage": { + "version": "1.10.0", + "license": "Apache-2.0", + "dependencies": { + "lie": "3.1.1" + } + }, + "node_modules/localforage/node_modules/lie": { + "version": "3.1.1", + "license": "MIT", + "dependencies": { + "immediate": "~3.0.5" + } + }, + "node_modules/locate-path": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "license": "MIT" + }, + "node_modules/lodash-es": { + "version": "4.17.21", + "license": "MIT" + }, + "node_modules/lodash._getnative": { + "version": "3.9.1", + "license": "MIT" + }, + "node_modules/lodash.bindall": { + "version": "4.4.0", + "license": "MIT" + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "license": "MIT" + }, + "node_modules/lodash.defaultsdeep": { + "version": "4.6.1", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.escape": { + "version": "4.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.flattendeep": { + "version": "4.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.isequal": { + "version": "4.5.0", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.omit": { + "version": "4.5.0", + "license": "MIT" + }, + "node_modules/lodash.throttle": { + "version": "4.0.1", + "license": "MIT", + "dependencies": { + "lodash.debounce": "^4.0.0" + } + }, + "node_modules/lodash.unescape": { + "version": "4.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/loglevel": { + "version": "1.9.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + }, + "funding": { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/loglevel" + } + }, + "node_modules/long": { + "version": "5.3.2", + "license": "Apache-2.0" + }, + "node_modules/lookup-closest-locale": { + "version": "6.2.0", + "license": "MIT" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lower-case": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/lowercase-keys": { + "version": "1.0.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/lz-string": { + "version": "1.5.0", + "license": "MIT", + "bin": { + "lz-string": "bin/bin.js" + } + }, + "node_modules/magic-string": { + "version": "0.22.5", + "license": "MIT", + "dependencies": { + "vlq": "^0.2.2" + } + }, + "node_modules/make-dir": { + "version": "2.1.0", + "license": "MIT", + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "5.7.2", + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/makeerror": { + "version": "1.0.12", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/map-cache": { + "version": "0.2.2", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/map-limit": { + "version": "0.0.1", + "license": "MIT", + "dependencies": { + "once": "~1.3.0" + } + }, + "node_modules/map-limit/node_modules/once": { + "version": "1.3.3", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/map-visit": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/matchmediaquery": { + "version": "0.2.1", + "license": "MIT", + "dependencies": { + "css-mediaquery": "^0.1.2" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/math-random": { + "version": "1.0.4", + "dev": true, + "license": "MIT" + }, + "node_modules/mathjs": { + "version": "11.11.1", + "resolved": "https://registry.npmjs.org/mathjs/-/mathjs-11.11.1.tgz", + "integrity": "sha512-uWrwMrhU31TCqHKmm1yFz0C352njGUVr/I1UnpMOxI/VBTTbCktx/mREUXx5Vyg11xrFdg/F3wnMM7Ql/csVsQ==", + "license": "Apache-2.0", + "dependencies": { + "@babel/runtime": "^7.22.15", + "complex.js": "^2.1.1", + "decimal.js": "^10.4.3", + "escape-latex": "^1.2.0", + "fraction.js": "4.3.4", + "javascript-natural-sort": "^0.7.1", + "seedrandom": "^3.0.5", + "tiny-emitter": "^2.1.0", + "typed-function": "^4.1.1" + }, + "bin": { + "mathjs": "bin/cli.js" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/matter-js": { + "version": "0.20.0", + "license": "MIT" + }, + "node_modules/md5.js": { + "version": "1.3.5", + "license": "MIT", + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mem": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/memory-fs": { + "version": "0.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/merge": { + "version": "1.2.1", + "dev": true, + "license": "MIT" + }, + "node_modules/merge-descriptors": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge-source-map": { + "version": "1.0.4", + "license": "MIT", + "dependencies": { + "source-map": "^0.5.6" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/mersenne-twister": { + "version": "1.1.0", + "license": "MIT" + }, + "node_modules/methods": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/microee": { + "version": "0.0.6", + "license": "BSD" + }, + "node_modules/micromatch": { + "version": "3.1.10", + "license": "MIT", + "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/micromatch/node_modules/extend-shallow": { + "version": "3.0.2", + "license": "MIT", + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/micromatch/node_modules/is-extendable": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/micromatch/node_modules/kind-of": { + "version": "6.0.3", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/miller-rabin": { + "version": "4.0.1", + "license": "MIT", + "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.2", + "license": "MIT" + }, + "node_modules/mime": { + "version": "1.6.0", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.54.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types/node_modules/mime-db": { + "version": "1.52.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/mimic-response": { + "version": "1.0.1", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/min-document": { + "version": "2.19.0", + "dependencies": { + "dom-walk": "^0.1.0" + } + }, + "node_modules/minilog": { + "version": "3.1.0", + "license": "MIT", + "dependencies": { + "microee": "0.0.6" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "license": "ISC" + }, + "node_modules/minimalistic-crypto-utils": { + "version": "1.0.1", + "license": "MIT" + }, + "node_modules/minimatch": { + "version": "3.1.2", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "3.3.6", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-collect": { + "version": "1.0.2", + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-flush": { + "version": "1.0.5", + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-pipeline": { + "version": "1.2.4", + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass/node_modules/yallist": { + "version": "4.0.0", + "license": "ISC" + }, + "node_modules/minizlib": { + "version": "2.1.2", + "license": "MIT", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/yallist": { + "version": "4.0.0", + "license": "ISC" + }, + "node_modules/mississippi": { + "version": "3.0.0", + "license": "BSD-2-Clause", + "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/mixin-deep": { + "version": "1.3.2", + "license": "MIT", + "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", + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mkdirp": { + "version": "1.0.3", + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mkpath": { + "version": "1.0.0", + "license": "MIT" + }, + "node_modules/mocha": { + "version": "4.1.0", + "license": "MIT", + "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", + "license": "MIT" + }, + "node_modules/mocha/node_modules/debug": { + "version": "3.1.0", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/mocha/node_modules/diff": { + "version": "3.3.1", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/mocha/node_modules/glob": { + "version": "7.1.2", + "license": "ISC", + "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", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mocha/node_modules/he": { + "version": "1.1.1", + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/mocha/node_modules/minimist": { + "version": "0.0.8", + "license": "MIT" + }, + "node_modules/mocha/node_modules/mkdirp": { + "version": "0.5.1", + "license": "MIT", + "dependencies": { + "minimist": "0.0.8" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/mocha/node_modules/ms": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/mocha/node_modules/supports-color": { + "version": "4.4.0", + "license": "MIT", + "dependencies": { + "has-flag": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/moo": { + "version": "0.5.2", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/move-concurrently": { + "version": "1.0.1", + "license": "ISC", + "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/move-concurrently/node_modules/mkdirp": { + "version": "0.5.6", + "license": "MIT", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "license": "MIT" + }, + "node_modules/multicast-dns": { + "version": "6.2.3", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "MIT" + }, + "node_modules/multipipe": { + "version": "0.3.1", + "license": "MIT", + "dependencies": { + "duplexer2": "^0.1.2" + } + }, + "node_modules/mute-stream": { + "version": "0.0.7", + "dev": true, + "license": "ISC" + }, + "node_modules/nan": { + "version": "2.22.2", + "license": "MIT", + "optional": true + }, + "node_modules/nanomatch": { + "version": "1.2.13", + "license": "MIT", + "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/extend-shallow": { + "version": "3.0.2", + "license": "MIT", + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/is-extendable": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/kind-of": { + "version": "6.0.3", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/nearley": { + "version": "2.20.1", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "MIT" + }, + "node_modules/negotiator": { + "version": "0.6.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "license": "MIT" + }, + "node_modules/nice-try": { + "version": "1.0.5", + "dev": true, + "license": "MIT" + }, + "node_modules/no-case": { + "version": "3.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node_modules/node-fetch": { + "version": "1.7.3", + "dev": true, + "license": "MIT", + "dependencies": { + "encoding": "^0.1.11", + "is-stream": "^1.0.1" + } + }, + "node_modules/node-forge": { + "version": "0.10.0", + "dev": true, + "license": "(BSD-3-Clause OR GPL-2.0)", + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/node-int64": { + "version": "0.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/node-libs-browser": { + "version": "2.2.1", + "license": "MIT", + "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", + "dev": true, + "license": "MIT", + "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.2", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/node-releases": { + "version": "2.0.19", + "license": "MIT" + }, + "node_modules/normalize-package-data": { + "version": "2.5.0", + "license": "BSD-2-Clause", + "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.2", + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "prepend-http": "^2.0.0", + "query-string": "^5.0.1", + "sort-keys": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm-normalize-package-bin": { + "version": "1.0.1", + "license": "ISC" + }, + "node_modules/npm-run-path": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/num2fraction": { + "version": "1.2.2", + "license": "MIT" + }, + "node_modules/number-is-nan": { + "version": "1.0.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nwmatcher": { + "version": "1.4.4", + "dev": true, + "license": "MIT" + }, + "node_modules/oauth-sign": { + "version": "0.9.0", + "license": "Apache-2.0", + "engines": { + "node": "*" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy": { + "version": "0.1.0", + "license": "MIT", + "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", + "license": "MIT", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-descriptor": { + "version": "0.1.7", + "license": "MIT", + "dependencies": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-is": { + "version": "1.1.6", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object-visit": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.9", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.8", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.fromentries/node_modules/es-abstract": { + "version": "1.24.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz", + "integrity": "sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.3.0", + "get-proto": "^1.0.1", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.2", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.2.1", + "is-set": "^2.0.3", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.1", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.4", + "object-keys": "^1.1.1", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.4", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "stop-iteration-iterator": "^1.1.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.19" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.getownpropertydescriptors": { + "version": "2.1.8", + "dev": true, + "license": "MIT", + "dependencies": { + "array.prototype.reduce": "^1.0.6", + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "gopd": "^1.0.1", + "safe-array-concat": "^1.1.2" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.getownpropertydescriptors/node_modules/es-abstract": { + "version": "1.24.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz", + "integrity": "sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.3.0", + "get-proto": "^1.0.1", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.2", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.2.1", + "is-set": "^2.0.3", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.1", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.4", + "object-keys": "^1.1.1", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.4", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "stop-iteration-iterator": "^1.1.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.19" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.omit": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "for-own": "^0.1.4", + "is-extendable": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.pick": { + "version": "1.3.0", + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.values": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/obuf": { + "version": "1.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/omggif": { + "version": "1.0.9" + }, + "node_modules/on-finished": { + "version": "2.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/opn": { + "version": "5.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "is-wsl": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/optionator": { + "version": "0.8.3", + "license": "MIT", + "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", + "license": "MIT" + }, + "node_modules/os-homedir": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/os-locale": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/os-locale/node_modules/lru-cache": { + "version": "4.1.5", + "dev": true, + "license": "ISC", + "dependencies": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "node_modules/os-locale/node_modules/yallist": { + "version": "2.1.2", + "dev": true, + "license": "ISC" + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/own-keys": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.6", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/p-cancelable": { + "version": "0.4.1", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/p-event": { + "version": "2.3.1", + "license": "MIT", + "dependencies": { + "p-timeout": "^2.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/p-finally": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/p-is-promise": { + "version": "1.1.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-locate/node_modules/p-limit": { + "version": "1.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-locate/node_modules/p-try": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/p-map": { + "version": "4.0.0", + "license": "MIT", + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-retry": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "retry": "^0.12.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/p-timeout": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "p-finally": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/pako": { + "version": "1.0.11", + "license": "(MIT AND Zlib)" + }, + "node_modules/papaparse": { + "version": "5.3.0", + "license": "MIT" + }, + "node_modules/parallel-transform": { + "version": "1.2.0", + "license": "MIT", + "dependencies": { + "cyclist": "^1.0.1", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + } + }, + "node_modules/param-case": { + "version": "3.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parent-module/node_modules/callsites": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-asn1": { + "version": "5.1.7", + "license": "ISC", + "dependencies": { + "asn1.js": "^4.10.1", + "browserify-aes": "^1.2.0", + "evp_bytestokey": "^1.0.3", + "hash-base": "~3.0", + "pbkdf2": "^3.1.2", + "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/parse-color": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "color-convert": "~0.5.0" + } + }, + "node_modules/parse-glob": { + "version": "3.0.4", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/parse-glob/node_modules/is-glob": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/parse-headers": { + "version": "2.0.6", + "license": "MIT" + }, + "node_modules/parse-json": { + "version": "4.0.0", + "license": "MIT", + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/parse-passwd": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/parse5": { + "version": "7.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "entities": "^6.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "7.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "domhandler": "^5.0.3", + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-parser-stream": { + "version": "7.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5/node_modules/entities": { + "version": "6.0.1", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/pascal-case": { + "version": "3.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/pascalcase": { + "version": "0.1.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-browserify": { + "version": "0.0.1", + "license": "MIT" + }, + "node_modules/path-dirname": { + "version": "1.0.2", + "devOptional": true, + "license": "MIT" + }, + "node_modules/path-exists": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-is-inside": { + "version": "1.0.2", + "dev": true, + "license": "(WTFPL OR MIT)" + }, + "node_modules/path-key": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "license": "MIT" + }, + "node_modules/path-to-regexp": { + "version": "0.1.12", + "dev": true, + "license": "MIT" + }, + "node_modules/path-type": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/pathfinding": { + "version": "0.4.18", + "dependencies": { + "heap": "0.2.5" + } + }, + "node_modules/pbkdf2": { + "version": "3.1.3", + "license": "MIT", + "dependencies": { + "create-hash": "~1.1.3", + "create-hmac": "^1.1.7", + "ripemd160": "=2.0.1", + "safe-buffer": "^5.2.1", + "sha.js": "^2.4.11", + "to-buffer": "^1.2.0" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/pbkdf2/node_modules/create-hash": { + "version": "1.1.3", + "license": "MIT", + "dependencies": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "sha.js": "^2.4.0" + } + }, + "node_modules/pbkdf2/node_modules/hash-base": { + "version": "2.0.2", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1" + } + }, + "node_modules/pbkdf2/node_modules/ripemd160": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "hash-base": "^2.0.0", + "inherits": "^2.0.1" + } + }, + "node_modules/pend": { + "version": "1.2.0", + "license": "MIT" + }, + "node_modules/PenguinMod-MarkDown": { + "name": "md", + "version": "0.6.0", + "resolved": "git+ssh://git@github.com/PenguinMod/PenguinMod-MarkDown.git#ae5971c234a9d13a8886bb3edcec3df5ceffab34", + "license": "MIT", + "dependencies": { + "slugo": "^0.2.1" + } + }, + "node_modules/performance-now": { + "version": "2.1.0", + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "4.0.1", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/pinkie": { + "version": "2.0.4", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinkie-promise": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "pinkie": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "license": "MIT", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "4.1.0", + "license": "MIT", + "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", + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "2.3.0", + "license": "MIT", + "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", + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/path-exists": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-up": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pmp-protobuf": { + "version": "1.5.1", + "license": "MIT", + "dependencies": { + "jszip": "^3.10.1", + "protobufjs": "^7.5.0" + } + }, + "node_modules/pnpm": { + "version": "7.33.7", + "resolved": "https://registry.npmjs.org/pnpm/-/pnpm-7.33.7.tgz", + "integrity": "sha512-ev4kEGQrOcaY30baTOXHIxpczjYGmNafjPj0IlfUCz5D8jEFOwe43oSf1P+/SnH/V7g1E3d3o1I4jz09p0cgDg==", + "license": "MIT", + "bin": { + "pnpm": "bin/pnpm.cjs", + "pnpx": "bin/pnpx.cjs" + }, + "engines": { + "node": ">=14.6" + }, + "funding": { + "url": "https://opencollective.com/pnpm" + } + }, + "node_modules/portfinder": { + "version": "1.0.37", + "dev": true, + "license": "MIT", + "dependencies": { + "async": "^3.2.6", + "debug": "^4.3.6" + }, + "engines": { + "node": ">= 10.12" + } + }, + "node_modules/portfinder/node_modules/async": { + "version": "3.2.6", + "dev": true, + "license": "MIT" + }, + "node_modules/posix-character-classes": { + "version": "0.1.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "7.0.39", + "license": "MIT", + "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", + "license": "MIT", + "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", + "license": "MIT" + }, + "node_modules/postcss-load-config": { + "version": "2.1.2", + "license": "MIT", + "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", + "license": "MIT", + "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", + "license": "MIT", + "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", + "license": "ISC", + "dependencies": { + "postcss": "^6.0.1" + } + }, + "node_modules/postcss-modules-extract-imports/node_modules/ansi-styles": { + "version": "3.2.1", + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-modules-extract-imports/node_modules/chalk": { + "version": "2.4.2", + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-modules-extract-imports/node_modules/color-convert": { + "version": "1.9.3", + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/postcss-modules-extract-imports/node_modules/postcss": { + "version": "6.0.23", + "license": "MIT", + "dependencies": { + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/postcss-modules-extract-imports/node_modules/source-map": { + "version": "0.6.1", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-modules-extract-imports/node_modules/supports-color": { + "version": "5.5.0", + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-modules-local-by-default": { + "version": "1.2.0", + "license": "MIT", + "dependencies": { + "css-selector-tokenizer": "^0.7.0", + "postcss": "^6.0.1" + } + }, + "node_modules/postcss-modules-local-by-default/node_modules/ansi-styles": { + "version": "3.2.1", + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-modules-local-by-default/node_modules/chalk": { + "version": "2.4.2", + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-modules-local-by-default/node_modules/color-convert": { + "version": "1.9.3", + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/postcss-modules-local-by-default/node_modules/postcss": { + "version": "6.0.23", + "license": "MIT", + "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/node_modules/source-map": { + "version": "0.6.1", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-modules-local-by-default/node_modules/supports-color": { + "version": "5.5.0", + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-modules-scope": { + "version": "1.1.0", + "license": "ISC", + "dependencies": { + "css-selector-tokenizer": "^0.7.0", + "postcss": "^6.0.1" + } + }, + "node_modules/postcss-modules-scope/node_modules/ansi-styles": { + "version": "3.2.1", + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-modules-scope/node_modules/chalk": { + "version": "2.4.2", + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-modules-scope/node_modules/color-convert": { + "version": "1.9.3", + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/postcss-modules-scope/node_modules/postcss": { + "version": "6.0.23", + "license": "MIT", + "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/node_modules/source-map": { + "version": "0.6.1", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-modules-scope/node_modules/supports-color": { + "version": "5.5.0", + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-modules-values": { + "version": "1.3.0", + "license": "ISC", + "dependencies": { + "icss-replace-symbols": "^1.1.0", + "postcss": "^6.0.1" + } + }, + "node_modules/postcss-modules-values/node_modules/ansi-styles": { + "version": "3.2.1", + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-modules-values/node_modules/chalk": { + "version": "2.4.2", + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-modules-values/node_modules/color-convert": { + "version": "1.9.3", + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/postcss-modules-values/node_modules/postcss": { + "version": "6.0.23", + "license": "MIT", + "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/node_modules/source-map": { + "version": "0.6.1", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-modules-values/node_modules/supports-color": { + "version": "5.5.0", + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-simple-vars": { + "version": "5.0.2", + "license": "MIT", + "dependencies": { + "postcss": "^7.0.14" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "license": "MIT" + }, + "node_modules/postcss/node_modules/picocolors": { + "version": "0.2.1", + "license": "ISC" + }, + "node_modules/postcss/node_modules/source-map": { + "version": "0.6.1", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/prelude-ls": { + "version": "1.1.2", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prepend-http": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/preserve": { + "version": "0.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pretty-error": { + "version": "2.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash": "^4.17.20", + "renderkid": "^2.0.4" + } + }, + "node_modules/pretty-format": { + "version": "21.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^3.0.0", + "ansi-styles": "^3.2.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-regex": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "3.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pretty-format/node_modules/color-convert": { + "version": "1.9.3", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/private": { + "version": "0.1.8", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/process": { + "version": "0.11.10", + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "license": "MIT" + }, + "node_modules/progress": { + "version": "2.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/promise": { + "version": "7.3.1", + "dev": true, + "license": "MIT", + "dependencies": { + "asap": "~2.0.3" + } + }, + "node_modules/promise-inflight": { + "version": "1.0.1", + "license": "ISC" + }, + "node_modules/prop-types": { + "version": "15.8.1", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/prop-types-exact": { + "version": "1.2.7", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "isarray": "^2.0.5", + "object.assign": "^4.1.7", + "own-keys": "^1.0.0" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/protobufjs": { + "version": "7.5.3", + "hasInstallScript": true, + "license": "BSD-3-Clause", + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "dev": true, + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/prr": { + "version": "1.0.1", + "license": "MIT" + }, + "node_modules/pseudomap": { + "version": "1.0.2", + "dev": true, + "license": "ISC" + }, + "node_modules/psl": { + "version": "1.15.0", + "license": "MIT", + "dependencies": { + "punycode": "^2.3.1" + }, + "funding": { + "url": "https://github.com/sponsors/lupomontero" + } + }, + "node_modules/psl/node_modules/punycode": { + "version": "2.3.1", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/public-encrypt": { + "version": "4.0.3", + "license": "MIT", + "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.2", + "license": "MIT" + }, + "node_modules/pump": { + "version": "3.0.3", + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/pumpify": { + "version": "1.5.1", + "license": "MIT", + "dependencies": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + } + }, + "node_modules/pumpify/node_modules/pump": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "1.4.1", + "license": "MIT" + }, + "node_modules/q": { + "version": "1.5.1", + "license": "MIT", + "engines": { + "node": ">=0.6.0", + "teleport": ">=0.2.0" + } + }, + "node_modules/qs": { + "version": "6.5.3", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/query-string": { + "version": "5.1.1", + "license": "MIT", + "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-es3": { + "version": "0.2.1", + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/querystringify": { + "version": "2.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/quote-stream": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "buffer-equal": "0.0.1", + "minimist": "^1.1.3", + "through2": "^2.0.0" + }, + "bin": { + "quote-stream": "bin/cmd.js" + } + }, + "node_modules/raf": { + "version": "3.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "performance-now": "^2.1.0" + } + }, + "node_modules/railroad-diagrams": { + "version": "1.0.0", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/randexp": { + "version": "0.4.6", + "dev": true, + "license": "MIT", + "dependencies": { + "discontinuous-range": "1.0.0", + "ret": "~0.1.10" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/randomatic": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/randomatic/node_modules/kind-of": { + "version": "6.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/randomfill": { + "version": "1.0.4", + "license": "MIT", + "dependencies": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "dev": true, + "license": "MIT", + "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/iconv-lite": { + "version": "0.4.24", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/raw-loader": { + "version": "0.5.1" + }, + "node_modules/react": { + "version": "16.14.0", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-contextmenu": { + "version": "2.9.4", + "license": "MIT", + "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.14.0", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2", + "scheduler": "^0.19.1" + }, + "peerDependencies": { + "react": "^16.14.0" + } + }, + "node_modules/react-draggable": { + "version": "3.0.5", + "license": "MIT", + "dependencies": { + "classnames": "^2.2.5", + "prop-types": "^15.6.0" + } + }, + "node_modules/react-ga": { + "version": "2.5.3", + "license": "Apache-2.0", + "optionalDependencies": { + "prop-types": "^15.6.0", + "react": "^15.6.2 || ^16.0" + } + }, + "node_modules/react-intl": { + "version": "2.9.0", + "license": "BSD-3-Clause", + "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", + "license": "MIT", + "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", + "license": "MIT" + }, + "node_modules/react-lifecycles-compat": { + "version": "3.0.4", + "license": "MIT" + }, + "node_modules/react-modal": { + "version": "3.9.1", + "license": "MIT", + "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", + "license": "MIT", + "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", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/react-popover/node_modules/lodash.debounce": { + "version": "3.1.1", + "license": "MIT", + "dependencies": { + "lodash._getnative": "^3.0.0" + } + }, + "node_modules/react-popover/node_modules/lodash.throttle": { + "version": "3.0.4", + "license": "MIT", + "dependencies": { + "lodash.debounce": "^3.0.0" + } + }, + "node_modules/react-popover/node_modules/ms": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/react-redux": { + "version": "5.0.7", + "license": "MIT", + "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", + "license": "BSD-3-Clause" + }, + "node_modules/react-responsive": { + "version": "4.1.0", + "license": "MIT", + "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-string-replace": { + "version": "0.4.4", + "license": "MIT", + "dependencies": { + "lodash": "^4.17.4" + }, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/react-style-proptype": { + "version": "3.2.2", + "license": "MIT", + "dependencies": { + "prop-types": "^15.5.4" + } + }, + "node_modules/react-tabs": { + "version": "2.3.0", + "license": "MIT", + "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", + "dev": true, + "license": "MIT", + "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", + "license": "MIT", + "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", + "license": "MIT", + "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", + "license": "MIT", + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/read-cache/node_modules/pify": { + "version": "2.3.0", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-package-json": { + "version": "2.1.2", + "license": "ISC", + "dependencies": { + "glob": "^7.1.1", + "json-parse-even-better-errors": "^2.3.0", + "normalize-package-data": "^2.0.0", + "npm-normalize-package-bin": "^1.0.0" + } + }, + "node_modules/read-pkg": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^2.0.0", + "read-pkg": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg/node_modules/path-type": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg/node_modules/pify": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/readable-stream": { + "version": "2.3.8", + "license": "MIT", + "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/isarray": { + "version": "1.0.0", + "license": "MIT" + }, + "node_modules/readable-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "license": "MIT" + }, + "node_modules/readable-stream/node_modules/string_decoder": { + "version": "1.1.1", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/readdirp": { + "version": "2.2.1", + "devOptional": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/readline2": { + "version": "0.1.1", + "license": "MIT", + "dependencies": { + "mute-stream": "0.0.4", + "strip-ansi": "^2.0.1" + } + }, + "node_modules/readline2/node_modules/ansi-regex": { + "version": "1.1.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readline2/node_modules/mute-stream": { + "version": "0.0.4", + "license": "BSD" + }, + "node_modules/readline2/node_modules/strip-ansi": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "ansi-regex": "^1.0.0" + }, + "bin": { + "strip-ansi": "cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/redux": { + "version": "3.7.2", + "license": "MIT", + "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.3", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash.isplainobject": "^4.0.6" + } + }, + "node_modules/redux-throttle": { + "version": "0.1.1", + "license": "MIT", + "dependencies": { + "lodash.throttle": "4.0.1" + } + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.10", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regenerate": { + "version": "1.4.2", + "dev": true, + "license": "MIT" + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.11.1", + "license": "MIT" + }, + "node_modules/regex-cache": { + "version": "0.4.4", + "dev": true, + "license": "MIT", + "dependencies": { + "is-equal-shallow": "^0.1.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regex-not": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regex-not/node_modules/extend-shallow": { + "version": "3.0.2", + "license": "MIT", + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regex-not/node_modules/is-extendable": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.4", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexpp": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.5.0" + } + }, + "node_modules/regexpu-core": { + "version": "6.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.2.0", + "regjsgen": "^0.8.0", + "regjsparser": "^0.12.0", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsgen": { + "version": "0.8.0", + "dev": true, + "license": "MIT" + }, + "node_modules/regjsparser": { + "version": "0.12.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "jsesc": "~3.0.2" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "3.0.2", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/relateurl": { + "version": "0.2.7", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/remove-trailing-separator": { + "version": "1.1.0", + "devOptional": true, + "license": "ISC" + }, + "node_modules/renderkid": { + "version": "2.0.7", + "dev": true, + "license": "MIT", + "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/css-select": { + "version": "4.3.0", + "dev": true, + "license": "BSD-2-Clause", + "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", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "BSD-2-Clause", + "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", + "dev": true, + "license": "BSD-2-Clause", + "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", + "dev": true, + "license": "BSD-2-Clause", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/htmlparser2": { + "version": "6.1.0", + "dev": true, + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "node_modules/repeat-element": { + "version": "1.1.4", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/repeat-string": { + "version": "1.6.1", + "license": "MIT", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/repeating": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-finite": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/request": { + "version": "2.88.2", + "license": "Apache-2.0", + "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/form-data": { + "version": "2.3.3", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-main-filename": { + "version": "1.0.1", + "dev": true, + "license": "ISC" + }, + "node_modules/requires-port": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/resolve": { + "version": "1.22.10", + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-from": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-cwd/node_modules/resolve-from": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-dir": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-url": { + "version": "0.2.1", + "license": "MIT" + }, + "node_modules/responselike": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "lowercase-keys": "^1.0.0" + } + }, + "node_modules/restore-cursor": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ret": { + "version": "0.1.15", + "license": "MIT", + "engines": { + "node": ">=0.12" + } + }, + "node_modules/retry": { + "version": "0.12.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "2.7.1", + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/ripemd160": { + "version": "2.0.2", + "license": "MIT", + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "node_modules/rst-selector-parser": { + "version": "2.2.3", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "lodash.flattendeep": "^4.4.0", + "nearley": "^2.7.10" + } + }, + "node_modules/rsvp": { + "version": "3.6.2", + "dev": true, + "license": "MIT", + "engines": { + "node": "0.12.* || 4.* || 6.* || >= 7.*" + } + }, + "node_modules/run-async": { + "version": "2.4.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/run-queue": { + "version": "1.0.3", + "license": "ISC", + "dependencies": { + "aproba": "^1.1.1" + } + }, + "node_modules/rx": { + "version": "2.5.3", + "license": "Apache-2.0" + }, + "node_modules/rxjs": { + "version": "6.6.7", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "node_modules/rxjs/node_modules/tslib": { + "version": "1.14.1", + "dev": true, + "license": "0BSD" + }, + "node_modules/safe-array-concat": { + "version": "1.1.3", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "has-symbols": "^1.1.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safe-push-apply": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-regex": { + "version": "1.1.0", + "license": "MIT", + "dependencies": { + "ret": "~0.1.10" + } + }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "license": "MIT" + }, + "node_modules/sane": { + "version": "2.5.2", + "dev": true, + "license": "MIT", + "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/fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "deprecated": "Upgrade to fsevents v2 to mitigate potential security issues", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "dependencies": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/sax": { + "version": "1.4.1", + "dev": true, + "license": "ISC" + }, + "node_modules/scheduler": { + "version": "0.19.1", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "node_modules/schema-utils": { + "version": "2.7.1", + "license": "MIT", + "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", + "resolved": "git+ssh://git@github.com/PenguinMod/PenguinMod-Audio.git#a60d7b212241a456a7b8f103a0912085ba4593a3", + "license": "BSD-3-Clause", + "dependencies": { + "@turbowarp/startaudiocontext": "^1.0.0", + "minilog": "^3.0.1" + } + }, + "node_modules/scratch-blocks": { + "version": "0.1.0", + "resolved": "git+ssh://git@github.com/PenguinMod/PenguinMod-Blocks.git#4b6c2645b22d02a9c934764306ed101f64fa4a85", + "license": "GPL-3.0" + }, + "node_modules/scratch-paint": { + "version": "0.2.0", + "resolved": "git+ssh://git@github.com/PenguinMod/PenguinMod-Paint.git#d95ce56cb65be792267bd88af84be8e75025da98", + "license": "GPL-3.0", + "dependencies": { + "@turbowarp/paper": "^0.12.202407262155", + "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" + }, + "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", + "scratch-render-fonts": "https://github.com/PenguinMod/penguinmod-render-fonts.git" + } + }, + "node_modules/scratch-paint/node_modules/classnames": { + "version": "2.2.5", + "license": "MIT" + }, + "node_modules/scratch-parser": { + "version": "0.0.0-development", + "resolved": "git+ssh://git@github.com/PenguinMod/PenguinMod-Parser.git#ad93a6d0d20bcb4374e531ecf20b87b861faf9fb", + "license": "BSD-3-Clause", + "dependencies": { + "@turbowarp/json": "^0.1.1", + "ajv": "6.3.0", + "jszip": "3.1.5", + "pify": "4.0.1" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/scratch-parser/node_modules/ajv": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.3.0.tgz", + "integrity": "sha512-6TQywaGYtRub2fqHkSXfVANlhfja2nbF33wCCHnt3aQstOrtd9jsQGiRUTIOlkEqcxpzRd2akfnqvBBPmLxs8g==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" + } + }, + "node_modules/scratch-parser/node_modules/core-js": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.3.0.tgz", + "integrity": "sha512-N41UFUZNqoTSGUSyL7kiStAkH31Hxq197A4Gp9MxTZfAd52pXod7VM7kWiRP0J0YpQDeaE4SLsb+2OGgtgvUEw==", + "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.", + "license": "MIT" + }, + "node_modules/scratch-parser/node_modules/fast-deep-equal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", + "integrity": "sha512-fueX787WZKCV0Is4/T2cyAdM4+x1S3MXXOAhavE1ys/W42SHAPacLTQhucja22QBYrfGw50M2sRiXPtTGv9Ymw==", + "license": "MIT" + }, + "node_modules/scratch-parser/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "license": "MIT" + }, + "node_modules/scratch-parser/node_modules/json-schema-traverse": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "integrity": "sha512-4JD/Ivzg7PoW8NzdrBSr3UFwC9mHgvI7Z6z3QGBsSHgKaRTUDmyZAAKJo2UbG1kUVfS9WS8bi36N49U1xw43DA==", + "license": "MIT" + }, + "node_modules/scratch-parser/node_modules/jszip": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.1.5.tgz", + "integrity": "sha512-5W8NUaFRFRqTOL7ZDDrx5qWHJyBXy6velVudIzQUSoqAAYqzSh2Z7/m0Rf1QbmQJccegD0r+YZxBjzqoBiEeJQ==", + "license": "(MIT OR GPL-3.0)", + "dependencies": { + "core-js": "~2.3.0", + "es6-promise": "~3.0.2", + "lie": "~3.1.0", + "pako": "~1.0.2", + "readable-stream": "~2.0.6" + } + }, + "node_modules/scratch-parser/node_modules/lie": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.1.1.tgz", + "integrity": "sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw==", + "license": "MIT", + "dependencies": { + "immediate": "~3.0.5" + } + }, + "node_modules/scratch-parser/node_modules/process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha512-yN0WQmuCX63LP/TMvAg31nvT6m4vDqJEiiv2CAZqWOGNWutc9DfDk1NPYYmKUFmaVM2UwDowH4u5AHWYP/jxKw==", + "license": "MIT" + }, + "node_modules/scratch-parser/node_modules/readable-stream": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", + "integrity": "sha512-TXcFfb63BQe1+ySzsHZI/5v1aJPCShfqvWJ64ayNImXMsN1Cd0YGk/wm8KB7/OeessgPc9QvS9Zou8QTkFzsLw==", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "string_decoder": "~0.10.x", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/scratch-parser/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", + "license": "MIT" + }, + "node_modules/scratch-render": { + "version": "0.1.0", + "resolved": "git+ssh://git@github.com/PenguinMod/PenguinMod-Render.git#4ee2ae659cd10dc2fbac8a7df59f4f7d5467b5ac", + "license": "BSD-3-Clause", + "dependencies": { + "grapheme-breaker": "0.3.2", + "hull.js": "0.2.10", + "ify-loader": "1.0.4", + "linebreak": "0.3.0", + "minilog": "3.1.0", + "raw-loader": "^0.5.1", + "scratch-svg-renderer": "git+https://github.com/PenguinMod/penguinmod-svg-renderer.git", + "twgl.js": "4.4.0" + }, + "peerDependencies": { + "scratch-render-fonts": "github:PenguinMod/penguinmod-render-fonts#master" + } + }, + "node_modules/scratch-render-fonts": { + "version": "1.0.0", + "resolved": "git+ssh://git@github.com/PenguinMod/penguinmod-render-fonts.git#4dda62c707f64505266aa62f7a6cc84f0e5812fd", + "dependencies": { + "base64-loader": "1.0.0" + } + }, + "node_modules/scratch-sb1-converter": { + "version": "0.2.7", + "license": "BSD-3-Clause", + "dependencies": { + "js-md5": "0.7.3", + "minilog": "3.1.0", + "text-encoding": "^0.7.0" + } + }, + "node_modules/scratch-storage": { + "version": "0.0.0-development", + "resolved": "git+ssh://git@github.com/PenguinMod/PenguinMod-Storage.git#722a6d1cc538e66e539e0094bc7b7c113bfb99fd", + "license": "BSD-3-Clause", + "dependencies": { + "arraybuffer-loader": "^1.0.3", + "base64-js": "1.3.0", + "fastestsmallesttextencoderdecoder": "^1.0.7", + "js-md5": "0.7.3", + "minilog": "3.1.0", + "worker-loader": "^2.0.0" + } + }, + "node_modules/scratch-storage/node_modules/base64-js": { + "version": "1.3.0", + "license": "MIT" + }, + "node_modules/scratch-svg-renderer": { + "name": "@turbowarp/scratch-svg-renderer", + "version": "1.0.0", + "resolved": "git+ssh://git@github.com/PenguinMod/penguinmod-svg-renderer.git#62a2be1e440ff6993cf5a5f5fac6f8ac60423bfb", + "license": "MPL-2.0", + "dependencies": { + "@turbowarp/nanolog": "^0.2.0", + "base64-js": "1.2.1", + "base64-loader": "1.0.0", + "dompurify": "^2.5.6", + "transformation-matrix": "1.15.0" + }, + "peerDependencies": { + "scratch-render-fonts": "github:PenguinMod/penguinmod-render-fonts#master" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/scratch-translate-extension-languages": { + "version": "0.0.20191118205314", + "license": "BSD-3-Clause" + }, + "node_modules/scratch-vm": { + "version": "0.2.0", + "resolved": "git+ssh://git@github.com/PenguinMod/PenguinMod-Vm.git#e52a422c1b5f774ce04dbcb435ae8287ecbda114", + "license": "BSD-3-Clause", + "dependencies": { + "@turbowarp/json": "^0.1.2", + "@vernier/godirect": "1.5.0", + "arraybuffer-loader": "^1.0.6", + "atob": "2.1.2", + "btoa": "1.2.1", + "cannon-es": "0.20.0", + "canvas-toBlob": "1.0.0", + "decode-html": "2.0.0", + "diff-match-patch": "1.0.4", + "dompurify": "^3.0.9", + "format-message": "6.2.1", + "htmlparser2": "^3.10.0", + "immutable": "3.8.2", + "jszip": "^3.1.5", + "lz-string": "^1.5.0", + "mathjs": "11.11.1", + "matter-js": "^0.20.0", + "mersenne-twister": "^1.1.0", + "minilog": "3.1.0", + "pathfinding": "^0.4.18", + "schema-utils": "^2.7.1", + "scratch-parser": "git+https://github.com/PenguinMod/PenguinMod-Parser.git#master", + "scratch-sb1-converter": "0.2.7", + "scratch-translate-extension-languages": "0.0.20191118205314", + "simplex-noise": "^4.0.1", + "text-encoding": "0.7.0", + "three": "0.153.0", + "three-mesh-bvh": "0.6.0", + "tone": "^14.7.77", + "worker-loader": "^1.1.1" + }, + "peerDependencies": { + "scratch-svg-renderer": "github:PenguinMod/penguinmod-svg-renderer#develop" + } + }, + "node_modules/scratch-vm/node_modules/dom-serializer": { + "version": "0.2.2", + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + } + }, + "node_modules/scratch-vm/node_modules/dom-serializer/node_modules/domelementtype": { + "version": "2.3.0", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/scratch-vm/node_modules/dom-serializer/node_modules/entities": { + "version": "2.2.0", + "license": "BSD-2-Clause", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/scratch-vm/node_modules/domelementtype": { + "version": "1.3.1", + "license": "BSD-2-Clause" + }, + "node_modules/scratch-vm/node_modules/domhandler": { + "version": "2.4.2", + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "1" + } + }, + "node_modules/scratch-vm/node_modules/dompurify": { + "version": "3.2.6", + "license": "(MPL-2.0 OR Apache-2.0)", + "optionalDependencies": { + "@types/trusted-types": "^2.0.7" + } + }, + "node_modules/scratch-vm/node_modules/domutils": { + "version": "1.7.0", + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "node_modules/scratch-vm/node_modules/entities": { + "version": "1.1.2", + "license": "BSD-2-Clause" + }, + "node_modules/scratch-vm/node_modules/htmlparser2": { + "version": "3.10.1", + "license": "MIT", + "dependencies": { + "domelementtype": "^1.3.1", + "domhandler": "^2.3.0", + "domutils": "^1.5.1", + "entities": "^1.1.1", + "inherits": "^2.0.1", + "readable-stream": "^3.1.1" + } + }, + "node_modules/scratch-vm/node_modules/readable-stream": { + "version": "3.6.2", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/scratch-vm/node_modules/worker-loader": { + "version": "1.1.1", + "license": "MIT", + "dependencies": { + "loader-utils": "^1.0.0", + "schema-utils": "^0.4.0" + }, + "engines": { + "node": ">= 4.8 < 5.0.0 || >= 5.10" + }, + "peerDependencies": { + "webpack": "^2.0.0 || ^3.0.0 || ^4.0.0" + } + }, + "node_modules/scratch-vm/node_modules/worker-loader/node_modules/schema-utils": { + "version": "0.4.7", + "license": "MIT", + "dependencies": { + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/seedrandom": { + "version": "3.0.5", + "license": "MIT" + }, + "node_modules/seek-bzip": { + "version": "1.0.6", + "license": "MIT", + "dependencies": { + "commander": "^2.8.1" + }, + "bin": { + "seek-bunzip": "bin/seek-bunzip", + "seek-table": "bin/seek-bzip-table" + } + }, + "node_modules/seek-bzip/node_modules/commander": { + "version": "2.20.3", + "license": "MIT" + }, + "node_modules/select-hose": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/selenium-webdriver": { + "version": "3.6.0", + "dev": true, + "license": "Apache-2.0", + "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", + "dev": true, + "license": "MIT", + "dependencies": { + "os-tmpdir": "~1.0.1" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/selfsigned": { + "version": "1.10.14", + "dev": true, + "license": "MIT", + "dependencies": { + "node-forge": "^0.10.0" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/send": { + "version": "0.19.0", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/send/node_modules/encodeurl": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/serialize-javascript": { + "version": "5.0.1", + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-index": { + "version": "1.9.1", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/serve-index/node_modules/depd": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.6.3", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "ISC" + }, + "node_modules/serve-index/node_modules/ms": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "dev": true, + "license": "ISC" + }, + "node_modules/serve-index/node_modules/statuses": { + "version": "1.5.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-static": { + "version": "1.16.2", + "dev": true, + "license": "MIT", + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.19.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-proto": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-value": { + "version": "2.0.1", + "license": "MIT", + "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/setimmediate": { + "version": "1.0.5", + "license": "MIT" + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "dev": true, + "license": "ISC" + }, + "node_modules/sha.js": { + "version": "2.4.12", + "license": "(MIT AND BSD-3-Clause)", + "dependencies": { + "inherits": "^2.0.4", + "safe-buffer": "^5.2.1", + "to-buffer": "^1.2.0" + }, + "bin": { + "sha.js": "bin.js" + }, + "engines": { + "node": ">= 0.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/shallow-copy": { + "version": "0.0.1", + "license": "MIT" + }, + "node_modules/shebang-command": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/shebang-regex": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/shellwords": { + "version": "0.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/should": { + "version": "13.2.3", + "license": "MIT", + "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", + "license": "MIT", + "dependencies": { + "should-type": "^1.4.0" + } + }, + "node_modules/should-format": { + "version": "3.0.3", + "license": "MIT", + "dependencies": { + "should-type": "^1.3.0", + "should-type-adaptors": "^1.0.1" + } + }, + "node_modules/should-type": { + "version": "1.4.0", + "license": "MIT" + }, + "node_modules/should-type-adaptors": { + "version": "1.1.0", + "license": "MIT", + "dependencies": { + "should-type": "^1.3.0", + "should-util": "^1.0.0" + } + }, + "node_modules/should-util": { + "version": "1.0.1", + "license": "MIT" + }, + "node_modules/side-channel": { + "version": "1.1.0", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "dev": true, + "license": "ISC" + }, + "node_modules/simplex-noise": { + "version": "4.0.3", + "license": "MIT" + }, + "node_modules/slash": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/slice-ansi": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", + "is-fullwidth-code-point": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/slice-ansi/node_modules/ansi-styles": { + "version": "3.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/slice-ansi/node_modules/color-convert": { + "version": "1.9.3", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/slugo": { + "version": "0.2.3", + "license": "MIT" + }, + "node_modules/snapdragon": { + "version": "0.8.2", + "license": "MIT", + "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", + "license": "MIT", + "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", + "license": "MIT", + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-util": { + "version": "3.0.1", + "license": "MIT", + "dependencies": { + "kind-of": "^3.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/debug": { + "version": "2.6.9", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/snapdragon/node_modules/define-property": { + "version": "0.2.5", + "license": "MIT", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-descriptor": { + "version": "0.1.7", + "license": "MIT", + "dependencies": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/snapdragon/node_modules/ms": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/sockjs": { + "version": "0.3.24", + "dev": true, + "license": "MIT", + "dependencies": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + } + }, + "node_modules/sockjs-client": { + "version": "1.6.1", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/sockjs/node_modules/uuid": { + "version": "8.3.2", + "dev": true, + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/sort-keys": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "is-plain-obj": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/sort-keys-length": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "sort-keys": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sort-keys-length/node_modules/sort-keys": { + "version": "1.1.2", + "license": "MIT", + "dependencies": { + "is-plain-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-list-map": { + "version": "2.0.1", + "license": "MIT" + }, + "node_modules/source-map": { + "version": "0.5.7", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-resolve": { + "version": "0.5.3", + "license": "MIT", + "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", + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-url": { + "version": "0.4.1", + "license": "MIT" + }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "license": "Apache-2.0", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.5.0", + "license": "CC-BY-3.0" + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.21", + "license": "CC0-1.0" + }, + "node_modules/spdy": { + "version": "4.0.2", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "MIT", + "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.2", + "dev": true, + "license": "MIT", + "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", + "license": "MIT", + "dependencies": { + "extend-shallow": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/split-string/node_modules/extend-shallow": { + "version": "3.0.2", + "license": "MIT", + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/split-string/node_modules/is-extendable": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "license": "BSD-3-Clause" + }, + "node_modules/sshpk": { + "version": "1.18.0", + "license": "MIT", + "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": "8.0.1", + "license": "ISC", + "dependencies": { + "minipass": "^3.1.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/standardized-audio-context": { + "version": "25.3.77", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.25.6", + "automation-events": "^7.0.9", + "tslib": "^2.7.0" + } + }, + "node_modules/startaudiocontext": { + "version": "1.2.1", + "license": "MIT" + }, + "node_modules/static-eval": { + "version": "2.1.1", + "license": "MIT", + "dependencies": { + "escodegen": "^2.1.0" + } + }, + "node_modules/static-eval/node_modules/escodegen": { + "version": "2.1.0", + "license": "BSD-2-Clause", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/static-eval/node_modules/estraverse": { + "version": "5.3.0", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/static-eval/node_modules/source-map": { + "version": "0.6.1", + "license": "BSD-3-Clause", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend": { + "version": "0.1.2", + "license": "MIT", + "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", + "license": "MIT", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-descriptor": { + "version": "0.1.7", + "license": "MIT", + "dependencies": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/static-module": { + "version": "2.2.5", + "license": "MIT", + "dependencies": { + "concat-stream": "~1.6.0", + "convert-source-map": "^1.5.1", + "duplexer2": "~0.1.4", + "escodegen": "~1.9.0", + "falafel": "^2.1.0", + "has": "^1.0.1", + "magic-string": "^0.22.4", + "merge-source-map": "1.0.4", + "object-inspect": "~1.4.0", + "quote-stream": "~1.0.2", + "readable-stream": "~2.3.3", + "shallow-copy": "~0.0.1", + "static-eval": "^2.0.0", + "through2": "~2.0.3" + } + }, + "node_modules/static-module/node_modules/escodegen": { + "version": "1.9.1", + "license": "BSD-2-Clause", + "dependencies": { + "esprima": "^3.1.3", + "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/static-module/node_modules/esprima": { + "version": "3.1.3", + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/static-module/node_modules/object-inspect": { + "version": "1.4.1", + "license": "MIT" + }, + "node_modules/static-module/node_modules/source-map": { + "version": "0.6.1", + "license": "BSD-3-Clause", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/stop-iteration-iterator": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/stream-browserify": { + "version": "2.0.2", + "license": "MIT", + "dependencies": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "node_modules/stream-each": { + "version": "1.2.3", + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "node_modules/stream-http": { + "version": "2.8.3", + "license": "MIT", + "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.3", + "license": "MIT" + }, + "node_modules/strict-uri-encode": { + "version": "1.1.0", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-length": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "astral-regex": "^1.0.0", + "strip-ansi": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/string-length/node_modules/ansi-regex": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/string-length/node_modules/strip-ansi": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/string-width": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.12", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "regexp.prototype.flags": "^1.5.3", + "set-function-name": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.matchall/node_modules/es-abstract": { + "version": "1.24.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz", + "integrity": "sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.3.0", + "get-proto": "^1.0.1", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.2", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.2.1", + "is-set": "^2.0.3", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.1", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.4", + "object-keys": "^1.1.1", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.4", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "stop-iteration-iterator": "^1.1.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.19" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.10", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-object-atoms": "^1.0.0", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trim/node_modules/es-abstract": { + "version": "1.24.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz", + "integrity": "sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.3.0", + "get-proto": "^1.0.1", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.2", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.2.1", + "is-set": "^2.0.3", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.1", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.4", + "object-keys": "^1.1.1", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.4", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "stop-iteration-iterator": "^1.1.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.19" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.9", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "3.0.1", + "license": "MIT", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-bom": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "is-utf8": "^0.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-dirs": { + "version": "2.1.0", + "license": "MIT", + "dependencies": { + "is-natural-number": "^4.0.1" + } + }, + "node_modules/strip-eof": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-json-comments": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-outer": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^1.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/style-loader": { + "version": "0.23.1", + "license": "MIT", + "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", + "license": "MIT", + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/supports-color": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/symbol-observable": { + "version": "1.2.0", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "dev": true, + "license": "MIT" + }, + "node_modules/table": { + "version": "5.4.6", + "dev": true, + "license": "BSD-3-Clause", + "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", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/table/node_modules/string-width": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tapable": { + "version": "0.1.10", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tar": { + "version": "6.2.1", + "license": "ISC", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar-stream": { + "version": "1.6.2", + "license": "MIT", + "dependencies": { + "bl": "^1.0.0", + "buffer-alloc": "^1.2.0", + "end-of-stream": "^1.0.0", + "fs-constants": "^1.0.0", + "readable-stream": "^2.3.0", + "to-buffer": "^1.1.1", + "xtend": "^4.0.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/tar/node_modules/minipass": { + "version": "5.0.0", + "license": "ISC", + "engines": { + "node": ">=8" + } + }, + "node_modules/tar/node_modules/yallist": { + "version": "4.0.0", + "license": "ISC" + }, + "node_modules/tcp-port-used": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "4.3.1", + "is2": "^2.0.6" + } + }, + "node_modules/tcp-port-used/node_modules/debug": { + "version": "4.3.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/tcp-port-used/node_modules/ms": { + "version": "2.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/terser": { + "version": "4.8.1", + "license": "BSD-2-Clause", + "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.6", + "license": "MIT", + "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", + "license": "ISC", + "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/chownr": { + "version": "1.1.4", + "license": "ISC" + }, + "node_modules/terser-webpack-plugin/node_modules/find-cache-dir": { + "version": "2.1.0", + "license": "MIT", + "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", + "license": "MIT", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/terser-webpack-plugin/node_modules/locate-path": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/terser-webpack-plugin/node_modules/mkdirp": { + "version": "0.5.6", + "license": "MIT", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/terser-webpack-plugin/node_modules/p-limit": { + "version": "2.3.0", + "license": "MIT", + "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", + "license": "MIT", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/terser-webpack-plugin/node_modules/pkg-dir": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/terser-webpack-plugin/node_modules/schema-utils": { + "version": "1.0.0", + "license": "MIT", + "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", + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/terser-webpack-plugin/node_modules/source-map": { + "version": "0.6.1", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/terser-webpack-plugin/node_modules/ssri": { + "version": "6.0.2", + "license": "ISC", + "dependencies": { + "figgy-pudding": "^3.5.1" + } + }, + "node_modules/terser-webpack-plugin/node_modules/webpack-sources": { + "version": "1.4.3", + "license": "MIT", + "dependencies": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + } + }, + "node_modules/terser-webpack-plugin/node_modules/y18n": { + "version": "4.0.3", + "license": "ISC" + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "license": "MIT" + }, + "node_modules/terser/node_modules/source-map": { + "version": "0.6.1", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/test-exclude": { + "version": "4.2.3", + "dev": true, + "license": "ISC", + "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/test-exclude/node_modules/arr-diff": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "arr-flatten": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/test-exclude/node_modules/array-unique": { + "version": "0.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/test-exclude/node_modules/braces": { + "version": "1.8.5", + "dev": true, + "license": "MIT", + "dependencies": { + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/test-exclude/node_modules/expand-brackets": { + "version": "0.1.5", + "dev": true, + "license": "MIT", + "dependencies": { + "is-posix-bracket": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/test-exclude/node_modules/extglob": { + "version": "0.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/test-exclude/node_modules/find-up": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/test-exclude/node_modules/is-extglob": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/test-exclude/node_modules/is-glob": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/test-exclude/node_modules/load-json-file": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "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/test-exclude/node_modules/micromatch": { + "version": "2.3.11", + "dev": true, + "license": "MIT", + "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/test-exclude/node_modules/normalize-path": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/test-exclude/node_modules/parse-json": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "error-ex": "^1.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/test-exclude/node_modules/path-exists": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/test-exclude/node_modules/path-type": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/test-exclude/node_modules/pify": { + "version": "2.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/test-exclude/node_modules/read-pkg": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "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/test-exclude/node_modules/read-pkg-up": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/text-encoding": { + "version": "0.7.0", + "license": "(Unlicense OR Apache-2.0)" + }, + "node_modules/text-table": { + "version": "0.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/theia": { + "version": "2.1.2", + "resolved": "git+ssh://git@github.com/FreshPenguin112/theia-pnpm.git#13571e769ea006f4061f0eaf316cf3c7d214bad6", + "license": "MIT", + "dependencies": { + "chalk": "^1.0.0", + "inquirer": "^0.8.2", + "pnpm": "^7.18.2", + "q": "^1.2.0", + "yargs": "^3.7.0" + }, + "bin": { + "theia": "index.js" + } + }, + "node_modules/theia/node_modules/ansi-regex": { + "version": "1.1.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/theia/node_modules/camelcase": { + "version": "2.1.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/theia/node_modules/cli-width": { + "version": "1.1.1", + "license": "ISC" + }, + "node_modules/theia/node_modules/figures": { + "version": "1.7.0", + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^1.0.5", + "object-assign": "^4.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/theia/node_modules/inquirer": { + "version": "0.8.5", + "license": "MIT", + "dependencies": { + "ansi-regex": "^1.1.1", + "chalk": "^1.0.0", + "cli-width": "^1.0.1", + "figures": "^1.3.5", + "lodash": "^3.3.1", + "readline2": "^0.1.1", + "rx": "^2.4.3", + "through": "^2.3.6" + } + }, + "node_modules/theia/node_modules/is-fullwidth-code-point": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "number-is-nan": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/theia/node_modules/lodash": { + "version": "3.10.1", + "license": "MIT" + }, + "node_modules/theia/node_modules/os-locale": { + "version": "1.4.0", + "license": "MIT", + "dependencies": { + "lcid": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/theia/node_modules/string-width": { + "version": "1.0.2", + "license": "MIT", + "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/theia/node_modules/yargs": { + "version": "3.32.0", + "license": "MIT", + "dependencies": { + "camelcase": "^2.0.1", + "cliui": "^3.0.3", + "decamelize": "^1.1.1", + "os-locale": "^1.4.0", + "string-width": "^1.0.1", + "window-size": "^0.1.4", + "y18n": "^3.2.0" + } + }, + "node_modules/three": { + "version": "0.153.0", + "resolved": "https://registry.npmjs.org/three/-/three-0.153.0.tgz", + "integrity": "sha512-OCP2/uQR6GcDpSLnJt/3a4mdS0kNWcbfUXIwLoEMgLzEUIVIYsSDwskpmOii/AkDM+BBwrl6+CKgrjX9+E2aWg==", + "license": "MIT" + }, + "node_modules/three-mesh-bvh": { + "version": "0.6.0", + "license": "MIT", + "peerDependencies": { + "three": ">= 0.151.0" + } + }, + "node_modules/throat": { + "version": "4.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/through": { + "version": "2.3.8", + "license": "MIT" + }, + "node_modules/through2": { + "version": "2.0.5", + "license": "MIT", + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/thunky": { + "version": "1.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/timed-out": { + "version": "4.0.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/timers-browserify": { + "version": "2.0.12", + "license": "MIT", + "dependencies": { + "setimmediate": "^1.0.4" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/tiny-emitter": { + "version": "2.1.0", + "license": "MIT" + }, + "node_modules/tiny-inflate": { + "version": "1.0.3", + "license": "MIT" + }, + "node_modules/tmp": { + "version": "0.0.33", + "dev": true, + "license": "MIT", + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/tmpl": { + "version": "1.0.5", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/to-arraybuffer": { + "version": "1.0.1", + "license": "MIT" + }, + "node_modules/to-buffer": { + "version": "1.2.1", + "license": "MIT", + "dependencies": { + "isarray": "^2.0.5", + "safe-buffer": "^5.2.1", + "typed-array-buffer": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/to-fast-properties": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-object-path": { + "version": "0.3.0", + "license": "MIT", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex": { + "version": "3.0.2", + "license": "MIT", + "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": "2.1.1", + "license": "MIT", + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex/node_modules/extend-shallow": { + "version": "3.0.2", + "license": "MIT", + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex/node_modules/is-extendable": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-style": { + "version": "1.3.3", + "license": "MIT" + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tone": { + "version": "14.9.17", + "license": "MIT", + "dependencies": { + "standardized-audio-context": "^25.3.70", + "tslib": "^2.3.1" + } + }, + "node_modules/tough-cookie": { + "version": "2.5.0", + "license": "BSD-3-Clause", + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/tough-cookie/node_modules/punycode": { + "version": "2.3.1", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "dev": true, + "license": "MIT" + }, + "node_modules/transformation-matrix": { + "version": "1.15.0", + "license": "MIT" + }, + "node_modules/transifex": { + "version": "1.6.6", + "license": "MIT", + "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", + "license": "MIT" + }, + "node_modules/trim-repeated": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^1.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/trim-right": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tsconfig-paths": { + "version": "3.15.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/tsconfig-paths/node_modules/strip-bom": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "license": "0BSD" + }, + "node_modules/tty-browserify": { + "version": "0.0.0", + "license": "MIT" + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tweetnacl": { + "version": "0.14.5", + "license": "Unlicense" + }, + "node_modules/twgl.js": { + "version": "4.4.0", + "license": "MIT" + }, + "node_modules/type-check": { + "version": "0.3.2", + "license": "MIT", + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "dev": true, + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.7", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0", + "reflect.getprototypeof": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-function": { + "version": "4.2.1", + "license": "MIT", + "engines": { + "node": ">= 18" + } + }, + "node_modules/typedarray": { + "version": "0.0.6", + "license": "MIT" + }, + "node_modules/ua-parser-js": { + "version": "0.7.40", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/ua-parser-js" + }, + { + "type": "paypal", + "url": "https://paypal.me/faisalman" + }, + { + "type": "github", + "url": "https://github.com/sponsors/faisalman" + } + ], + "license": "MIT", + "bin": { + "ua-parser-js": "script/cli.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/uglify-es": { + "version": "3.3.10", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "commander": "~2.14.1", + "source-map": "~0.6.1" + }, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/uglify-es/node_modules/commander": { + "version": "2.14.1", + "dev": true, + "license": "MIT" + }, + "node_modules/uglify-es/node_modules/source-map": { + "version": "0.6.1", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/uglify-js": { + "version": "3.19.3", + "dev": true, + "license": "BSD-2-Clause", + "optional": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/uglifyjs-webpack-plugin": { + "version": "1.3.0", + "dev": true, + "license": "MIT", + "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/cacache": { + "version": "10.0.4", + "dev": true, + "license": "ISC", + "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/uglifyjs-webpack-plugin/node_modules/chownr": { + "version": "1.1.4", + "dev": true, + "license": "ISC" + }, + "node_modules/uglifyjs-webpack-plugin/node_modules/find-cache-dir": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "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/lru-cache": { + "version": "4.1.5", + "dev": true, + "license": "ISC", + "dependencies": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "node_modules/uglifyjs-webpack-plugin/node_modules/make-dir": { + "version": "1.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/uglifyjs-webpack-plugin/node_modules/mississippi": { + "version": "2.0.0", + "dev": true, + "license": "BSD-2-Clause", + "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/uglifyjs-webpack-plugin/node_modules/mkdirp": { + "version": "0.5.6", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/uglifyjs-webpack-plugin/node_modules/pify": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/uglifyjs-webpack-plugin/node_modules/pkg-dir": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/uglifyjs-webpack-plugin/node_modules/pump": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/uglifyjs-webpack-plugin/node_modules/schema-utils": { + "version": "0.4.7", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/uglifyjs-webpack-plugin/node_modules/serialize-javascript": { + "version": "1.9.1", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/uglifyjs-webpack-plugin/node_modules/source-map": { + "version": "0.6.1", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/uglifyjs-webpack-plugin/node_modules/ssri": { + "version": "5.3.0", + "dev": true, + "license": "ISC", + "dependencies": { + "safe-buffer": "^5.1.1" + } + }, + "node_modules/uglifyjs-webpack-plugin/node_modules/webpack-sources": { + "version": "1.4.3", + "dev": true, + "license": "MIT", + "dependencies": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + } + }, + "node_modules/uglifyjs-webpack-plugin/node_modules/y18n": { + "version": "4.0.3", + "dev": true, + "license": "ISC" + }, + "node_modules/uglifyjs-webpack-plugin/node_modules/yallist": { + "version": "2.1.2", + "dev": true, + "license": "ISC" + }, + "node_modules/unbox-primitive": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-bigints": "^1.0.2", + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/unbzip2-stream": { + "version": "1.4.3", + "license": "MIT", + "dependencies": { + "buffer": "^5.2.1", + "through": "^2.3.8" + } + }, + "node_modules/unbzip2-stream/node_modules/buffer": { + "version": "5.7.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/undici": { + "version": "7.11.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20.18.1" + } + }, + "node_modules/undici-types": { + "version": "7.8.0", + "license": "MIT" + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "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.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-trie": { + "version": "0.3.1", + "license": "MIT", + "dependencies": { + "pako": "^0.2.5", + "tiny-inflate": "^1.0.0" + } + }, + "node_modules/unicode-trie/node_modules/pako": { + "version": "0.2.9", + "license": "MIT" + }, + "node_modules/union-value": { + "version": "1.0.1", + "license": "MIT", + "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", + "license": "ISC", + "dependencies": { + "unique-slug": "^2.0.0" + } + }, + "node_modules/unique-slug": { + "version": "2.0.2", + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4" + } + }, + "node_modules/universalify": { + "version": "0.1.2", + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/unset-value": { + "version": "1.0.0", + "license": "MIT", + "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", + "license": "MIT", + "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", + "license": "MIT", + "dependencies": { + "isarray": "1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-values": { + "version": "0.1.4", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/isarray": { + "version": "1.0.0", + "license": "MIT" + }, + "node_modules/upath": { + "version": "1.2.0", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=4", + "yarn": "*" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.3", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/uri-js/node_modules/punycode": { + "version": "2.3.1", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/urix": { + "version": "0.1.0", + "license": "MIT" + }, + "node_modules/url": { + "version": "0.11.4", + "license": "MIT", + "dependencies": { + "punycode": "^1.4.1", + "qs": "^6.12.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/url-loader": { + "version": "4.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "loader-utils": "^2.0.0", + "mime-types": "^2.1.27", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "file-loader": "*", + "webpack": "^4.0.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "file-loader": { + "optional": true + } + } + }, + "node_modules/url-loader/node_modules/loader-utils": { + "version": "2.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/url-loader/node_modules/schema-utils": { + "version": "3.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/url-parse": { + "version": "1.5.10", + "dev": true, + "license": "MIT", + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/url-parse-lax": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "prepend-http": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/url-to-options": { + "version": "1.0.1", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/url/node_modules/qs": { + "version": "6.14.0", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/use": { + "version": "3.1.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/util": { + "version": "0.11.1", + "license": "MIT", + "dependencies": { + "inherits": "2.0.3" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "license": "MIT" + }, + "node_modules/util.promisify": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.2", + "object.getownpropertydescriptors": "^2.0.3" + } + }, + "node_modules/util/node_modules/inherits": { + "version": "2.0.3", + "license": "ISC" + }, + "node_modules/utila": { + "version": "0.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "3.4.0", + "license": "MIT", + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/v8-compile-cache": { + "version": "2.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "license": "Apache-2.0", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/verror": { + "version": "1.10.0", + "engines": [ + "node >=0.6.0" + ], + "license": "MIT", + "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", + "license": "MIT" + }, + "node_modules/vlq": { + "version": "0.2.3", + "license": "MIT" + }, + "node_modules/vm-browserify": { + "version": "1.1.2", + "license": "MIT" + }, + "node_modules/walker": { + "version": "1.0.8", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/warning": { + "version": "4.0.3", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "node_modules/watch": { + "version": "0.18.0", + "dev": true, + "license": "Apache-2.0", + "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", + "license": "MIT", + "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", + "license": "MIT", + "optional": true, + "dependencies": { + "chokidar": "^2.1.8" + } + }, + "node_modules/watchpack-chokidar2/node_modules/chokidar": { + "version": "2.1.8", + "license": "MIT", + "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/chokidar/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": "Upgrade to fsevents v2 to mitigate potential security issues", + "hasInstallScript": true, + "license": "MIT", + "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", + "license": "ISC", + "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", + "license": "MIT", + "optional": true, + "dependencies": { + "is-extglob": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wav-encoder": { + "version": "1.3.0", + "license": "MIT" + }, + "node_modules/wbuf": { + "version": "1.7.3", + "dev": true, + "license": "MIT", + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/web-audio-test-api": { + "version": "0.5.2", + "dev": true, + "license": "MIT" + }, + "node_modules/webidl-conversions": { + "version": "4.0.2", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/webpack": { + "version": "4.46.0", + "license": "MIT", + "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", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-cli/node_modules/ansi-styles": { + "version": "3.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/webpack-cli/node_modules/camelcase": { + "version": "5.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-cli/node_modules/chalk": { + "version": "2.4.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/webpack-cli/node_modules/chalk/node_modules/supports-color": { + "version": "5.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/webpack-cli/node_modules/cliui": { + "version": "5.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "node_modules/webpack-cli/node_modules/color-convert": { + "version": "1.9.3", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/webpack-cli/node_modules/enhanced-resolve": { + "version": "4.5.0", + "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", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-cli/node_modules/get-caller-file": { + "version": "2.0.5", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/webpack-cli/node_modules/locate-path": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-cli/node_modules/require-main-filename": { + "version": "2.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/webpack-cli/node_modules/string-width": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-cli/node_modules/supports-color": { + "version": "6.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-cli/node_modules/tapable": { + "version": "1.1.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-cli/node_modules/wrap-ansi": { + "version": "5.1.0", + "dev": true, + "license": "MIT", + "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/y18n": { + "version": "4.0.3", + "dev": true, + "license": "ISC" + }, + "node_modules/webpack-cli/node_modules/yargs": { + "version": "13.3.2", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "ISC", + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "node_modules/webpack-dev-middleware": { + "version": "3.7.3", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "MIT", + "dependencies": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "node_modules/webpack-dev-middleware/node_modules/mime": { + "version": "2.6.0", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/webpack-dev-middleware/node_modules/mkdirp": { + "version": "0.5.6", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/webpack-dev-server": { + "version": "3.11.2", + "dev": true, + "license": "MIT", + "dependencies": { + "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.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": "4.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/ansi-styles": { + "version": "3.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/webpack-dev-server/node_modules/array-union": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "array-uniq": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/camelcase": { + "version": "5.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/chokidar": { + "version": "2.1.8", + "dev": true, + "license": "MIT", + "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/chokidar/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": "Upgrade to fsevents v2 to mitigate potential security issues", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "dependencies": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/webpack-dev-server/node_modules/cliui": { + "version": "5.0.0", + "dev": true, + "license": "ISC", + "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/strip-ansi": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/color-convert": { + "version": "1.9.3", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/webpack-dev-server/node_modules/del": { + "version": "4.1.1", + "dev": true, + "license": "MIT", + "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/webpack-dev-server/node_modules/find-up": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/get-caller-file": { + "version": "2.0.5", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/webpack-dev-server/node_modules/glob-parent": { + "version": "3.1.0", + "dev": true, + "license": "ISC", + "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", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/globby": { + "version": "6.1.0", + "dev": true, + "license": "MIT", + "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/webpack-dev-server/node_modules/globby/node_modules/pify": { + "version": "2.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/locate-path": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/p-limit": { + "version": "2.3.0", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/p-map": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/require-main-filename": { + "version": "2.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/webpack-dev-server/node_modules/schema-utils": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "MIT", + "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/strip-ansi": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/supports-color": { + "version": "6.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/wrap-ansi": { + "version": "5.1.0", + "dev": true, + "license": "MIT", + "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/strip-ansi": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/y18n": { + "version": "4.0.3", + "dev": true, + "license": "ISC" + }, + "node_modules/webpack-dev-server/node_modules/yargs": { + "version": "13.3.2", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "ISC", + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "node_modules/webpack-log": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-colors": "^3.0.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/webpack-sources": { + "version": "3.2.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack/node_modules/enhanced-resolve": { + "version": "4.5.0", + "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", + "license": "MIT", + "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/memory-fs": { + "version": "0.4.1", + "license": "MIT", + "dependencies": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "node_modules/webpack/node_modules/mkdirp": { + "version": "0.5.6", + "license": "MIT", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/webpack/node_modules/schema-utils": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/webpack/node_modules/source-map": { + "version": "0.6.1", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/tapable": { + "version": "1.1.3", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack/node_modules/webpack-sources": { + "version": "1.4.3", + "license": "MIT", + "dependencies": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + } + }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "dev": true, + "license": "Apache-2.0", + "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", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/whatwg-encoding": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/whatwg-fetch": { + "version": "3.6.20", + "dev": true, + "license": "MIT" + }, + "node_modules/whatwg-mimetype": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/whatwg-url": { + "version": "4.8.0", + "dev": true, + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/whatwg-url/node_modules/webidl-conversions": { + "version": "3.0.1", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/which": { + "version": "1.3.1", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", + "is-generator-function": "^1.0.10", + "is-regex": "^1.2.1", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.1.0", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-module": { + "version": "2.0.1", + "dev": true, + "license": "ISC" + }, + "node_modules/which-typed-array": { + "version": "1.1.19", + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/window-size": { + "version": "0.1.4", + "license": "MIT", + "bin": { + "window-size": "cli.js" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wordwrap": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/worker-farm": { + "version": "1.7.0", + "license": "MIT", + "dependencies": { + "errno": "~0.1.7" + } + }, + "node_modules/worker-loader": { + "version": "2.0.0", + "license": "MIT", + "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", + "license": "MIT", + "dependencies": { + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/wrap-ansi": { + "version": "2.1.0", + "license": "MIT", + "dependencies": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "number-is-nan": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "1.0.2", + "license": "MIT", + "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/wrappy": { + "version": "1.0.2", + "license": "ISC" + }, + "node_modules/write": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "mkdirp": "^0.5.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/write-file-atomic": { + "version": "2.4.3", + "dev": true, + "license": "ISC", + "dependencies": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" + } + }, + "node_modules/write/node_modules/mkdirp": { + "version": "0.5.6", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/ws": { + "version": "6.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "async-limiter": "~1.0.0" + } + }, + "node_modules/xhr": { + "version": "2.5.0", + "license": "MIT", + "dependencies": { + "global": "~4.3.0", + "is-function": "^1.0.1", + "parse-headers": "^2.0.0", + "xtend": "^4.0.0" + } + }, + "node_modules/xml": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/xml-name-validator": { + "version": "2.0.1", + "dev": true, + "license": "WTFPL" + }, + "node_modules/xml2js": { + "version": "0.4.23", + "dev": true, + "license": "MIT", + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/xmlbuilder": { + "version": "11.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "license": "MIT", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "3.2.2", + "license": "ISC" + }, + "node_modules/yallist": { + "version": "3.1.1", + "license": "ISC" + }, + "node_modules/yargs": { + "version": "9.0.1", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "ISC", + "dependencies": { + "camelcase": "^4.1.0" + } + }, + "node_modules/yargs/node_modules/load-json-file": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "MIT", + "dependencies": { + "error-ex": "^1.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/yargs/node_modules/path-type": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "pify": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/yargs/node_modules/pify": { + "version": "2.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/yargs/node_modules/read-pkg": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/yauzl": { + "version": "2.10.0", + "license": "MIT", + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000000000000000000000000000000000000..9f5aad354e5557690a8f32c123ebadc8afff85ae --- /dev/null +++ b/package.json @@ -0,0 +1,163 @@ +{ + "name": "scratch-gui", + "version": "0.1.0", + "description": "GraphicaL User Interface for creating and running Scratch 3.0 projects", + "main": "./dist/scratch-gui.js", + "scripts": { + "buildall": "npm run build && npm run deploy", + "build": "webpack --colors --bail", + "clean": "rimraf ./build && mkdirp build && rimraf ./dist && mkdirp dist", + "deploy": "npm uni gh-pages && npm i gh-pages -g && gh-pages -d src", + "prune": "./prune-gh-pages.sh", + "i18n:push": "tx-push-src scratch-editor interface translations/en.json", + "i18n:src": "rimraf ./translations/messages/src && babel src > tmp.js && rimraf tmp.js && build-i18n-src ./translations/messages/src ./translations/ && npm run i18n:push", + "start": "cross-env NODE_OPTIONS=--openssl-legacy-provider webpack-dev-server --host 0.0.0.0 --port $PORT --disable-host-check", + "test": "npm run test:lint && npm run test:unit && npm run build && npm run test:integration", + "test:integration": "jest --maxWorkers=4 test[\\\\/]integration", + "test:lint": "eslint . --ext .js,.jsx", + "test:unit": "jest test[\\\\/]unit", + "test:smoke": "jest --runInBand test[\\\\/]smoke", + "watch": "webpack --colors --watch" + }, + "author": "Massachusetts Institute of Technology", + "license": "GPL-3.0", + "private": true, + "homepage": "https://github.com/LLK/scratch-gui#readme", + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/LLK/scratch-gui.git" + }, + "dependencies": { + "mathjs": "13.2.0", + "ml5": "^0.12.2", + "@turbowarp/jszip": "^3.11.1", + "@turbowarp/scratch-l10n": "^3.1000.20230326022803", + "arraybuffer-loader": "^1.0.8", + "autoprefixer": "^9.8.8", + "base64-loader": "1.0.0", + "bowser": "1.9.4", + "classnames": "2.2.6", + "computed-style-to-inline-style": "3.0.0", + "copy-webpack-plugin": "6.4.1", + "core-js": "2.5.7", + "css-loader": "^1.0.1", + "es6-object-assign": "1.1.0", + "file-loader": "2.0.0", + "get-float-time-domain-data": "0.1.0", + "get-user-media-promise": "1.1.4", + "immutable": "3.8.2", + "intl": "1.2.5", + "intl-messageformat": "^2.2.0", + "js-base64": "2.4.9", + "jszip": "^3.10.1", + "keymirror": "0.1.1", + "localforage": "^1.10.0", + "lodash.merge": "4.6.2", + "lodash.bindall": "4.4.0", + "lodash.debounce": "4.0.8", + "lodash.omit": "4.5.0", + "lodash.throttle": "4.0.1", + "minilog": "3.1.0", + "omggif": "1.0.9", + "papaparse": "5.3.0", + "PenguinMod-MarkDown": "github:PenguinMod/PenguinMod-MarkDown#master", + "pmp-protobuf": "^1.5.1", + "postcss-import": "^12.0.1", + "postcss-loader": "^3.0.0", + "postcss-simple-vars": "^5.0.2", + "prop-types": "^15.8.1", + "protobufjs": "^7.3.2", + "query-string": "^5.1.1", + "raw-loader": "^0.5.1", + "react": "^16.0.0", + "react-contextmenu": "2.9.4", + "react-dom": "^16.0.0", + "react-draggable": "3.0.5", + "react-ga": "2.5.3", + "react-intl": "2.9.0", + "react-intl-redux": "0.7.0", + "react-modal": "3.9.1", + "react-popover": "0.5.10", + "react-redux": "5.0.7", + "react-responsive": "^4.1.0", + "react-string-replace": "^0.4.4", + "react-style-proptype": "3.2.2", + "react-tabs": "2.3.0", + "react-tooltip": "3.8.0", + "react-virtualized": "9.20.1", + "redux": "3.7.2", + "redux-throttle": "0.1.1", + "scratch-audio": "github:PenguinMod/PenguinMod-Audio#develop", + "scratch-blocks": "github:PenguinMod/PenguinMod-Blocks#develop-builds", + "scratch-paint": "github:PenguinMod/PenguinMod-Paint#develop", + "scratch-render": "github:PenguinMod/PenguinMod-Render#develop", + "scratch-render-fonts": "github:PenguinMod/penguinmod-render-fonts#master", + "scratch-storage": "github:PenguinMod/PenguinMod-Storage#develop", + "scratch-svg-renderer": "github:PenguinMod/penguinmod-svg-renderer#develop", + "startaudiocontext": "1.2.1", + "style-loader": "^0.23.1", + "text-encoding": "0.7.0", + "theia": "github:FreshPenguin112/theia-pnpm#master", + "to-style": "1.3.3", + "wav-encoder": "1.3.0", + "xhr": "2.5.0" + }, + "peerDependencies": { + "react": "^16.0.0", + "react-dom": "^16.0.0" + }, + "devDependencies": { + "@babel/cli": "7.14.8", + "@babel/core": "7.14.8", + "@babel/plugin-proposal-object-rest-spread": "7.14.7", + "@babel/plugin-syntax-dynamic-import": "7.2.0", + "@babel/plugin-transform-async-to-generator": "7.14.5", + "@babel/preset-env": "7.14.8", + "@babel/preset-react": "7.14.5", + "babel-core": "7.0.0-bridge.0", + "babel-eslint": "10.0.3", + "babel-loader": "8.2.2", + "chromedriver": "105.0.0", + "cross-env": "^7.0.3", + "enzyme": "3.10.0", + "enzyme-adapter-react-16": "1.3.0", + "eslint": "5.16.0", + "eslint-config-scratch": "6.0.0", + "eslint-import-resolver-webpack": "0.11.1", + "eslint-plugin-import": "2.23.4", + "eslint-plugin-jest": "22.17.0", + "eslint-plugin-react": "7.24.0", + "gh-pages": "3.2.3", + "html-webpack-plugin": "^4.5.2", + "jest": "21.2.1", + "jest-junit": "7.0.0", + "lodash.defaultsdeep": "4.6.1", + "mkdirp": "1.0.3", + "raf": "3.4.1", + "react-test-renderer": "16.2.0", + "redux-mock-store": "1.5.3", + "rimraf": "2.7.1", + "selenium-webdriver": "3.6.0", + "uglifyjs-webpack-plugin": "1.3.0", + "url-loader": "^4.1.1", + "web-audio-test-api": "0.5.2", + "webpack": "4.46.0", + "webpack-cli": "3.3.12", + "webpack-dev-server": "3.11.2", + "webpack-sources": "3.2.3" + }, + "jest": { + "setupFiles": [ + "raf/polyfill", + "/test/helpers/enzyme-setup.js" + ], + "testPathIgnorePatterns": [ + "src/test.js" + ], + "moduleNameMapper": { + "\\.(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", + "editor-msgs(\\.js)?$": "/test/__mocks__/editor-msgs-mock.js" + } + } +} diff --git a/pauseplay/ignore.txt b/pauseplay/ignore.txt new file mode 100644 index 0000000000000000000000000000000000000000..63950b1acbecc8977b5d54e440bb4b3d4b59abc9 --- /dev/null +++ b/pauseplay/ignore.txt @@ -0,0 +1 @@ +these contents will be deleted to make way for two new icons diff --git a/pauseplay/pause.svg b/pauseplay/pause.svg new file mode 100644 index 0000000000000000000000000000000000000000..477970339b7ddadb937ef34b8c0e15255af87506 Binary files /dev/null and b/pauseplay/pause.svg differ diff --git a/pauseplay/play.svg b/pauseplay/play.svg new file mode 100644 index 0000000000000000000000000000000000000000..04ee2092b687c45a717d31d02558322141a5892d Binary files /dev/null and b/pauseplay/play.svg differ diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000000000000000000000000000000000000..b2f90dda495b487a8725a624392a585a82399d86 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,11776 @@ +lockfileVersion: '6.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +dependencies: + '@turbowarp/scratch-l10n': + specifier: ^3.1000.20230326022803 + version: 3.1000.20230326022803 + PenguinMod-MarkDown: + specifier: github:PenguinMod/PenguinMod-MarkDown#master + version: github.com/PenguinMod/PenguinMod-MarkDown/af23e940551a5ea30f8c6aa118c84a791ecf0f02 + arraybuffer-loader: + specifier: ^1.0.8 + version: 1.0.8 + autoprefixer: + specifier: ^9.8.8 + version: 9.8.8 + base64-loader: + specifier: 1.0.0 + version: 1.0.0 + bowser: + specifier: 1.9.4 + version: 1.9.4 + classnames: + specifier: 2.2.6 + version: 2.2.6 + computed-style-to-inline-style: + specifier: 3.0.0 + version: 3.0.0 + copy-webpack-plugin: + specifier: 6.4.1 + version: 6.4.1(webpack@4.46.0) + core-js: + specifier: 2.5.7 + version: 2.5.7 + css-loader: + specifier: ^1.0.1 + version: 1.0.1(webpack@4.46.0) + es6-object-assign: + specifier: 1.1.0 + version: 1.1.0 + file-loader: + specifier: 2.0.0 + version: 2.0.0(webpack@4.46.0) + get-float-time-domain-data: + specifier: 0.1.0 + version: 0.1.0 + get-user-media-promise: + specifier: 1.1.4 + version: 1.1.4 + immutable: + specifier: 3.8.2 + version: 3.8.2 + intl: + specifier: 1.2.5 + version: 1.2.5 + intl-messageformat: + specifier: ^2.2.0 + version: 2.2.0 + js-base64: + specifier: 2.4.9 + version: 2.4.9 + keymirror: + specifier: 0.1.1 + version: 0.1.1 + localforage: + specifier: ^1.10.0 + version: 1.10.0 + lodash.bindall: + specifier: 4.4.0 + version: 4.4.0 + lodash.debounce: + specifier: 4.0.8 + version: 4.0.8 + lodash.omit: + specifier: 4.5.0 + version: 4.5.0 + lodash.throttle: + specifier: 4.0.1 + version: 4.0.1 + minilog: + specifier: 3.1.0 + version: 3.1.0 + omggif: + specifier: 1.0.9 + version: 1.0.9 + papaparse: + specifier: 5.3.0 + version: 5.3.0 + postcss-import: + specifier: ^12.0.1 + version: 12.0.1 + postcss-loader: + specifier: ^3.0.0 + version: 3.0.0 + postcss-simple-vars: + specifier: ^5.0.2 + version: 5.0.2 + prop-types: + specifier: ^15.8.1 + version: 15.8.1 + query-string: + specifier: ^5.1.1 + version: 5.1.1 + raw-loader: + specifier: ^0.5.1 + version: 0.5.1 + react: + specifier: ^16.14.0 + version: 16.14.0 + react-contextmenu: + specifier: 2.9.4 + version: 2.9.4(prop-types@15.8.1)(react-dom@16.14.0)(react@16.14.0) + react-dom: + specifier: ^16.14.0 + version: 16.14.0(react@16.14.0) + react-draggable: + specifier: 3.0.5 + version: 3.0.5(react-dom@16.14.0)(react@16.14.0) + react-ga: + specifier: 2.5.3 + version: 2.5.3 + react-intl: + specifier: 2.9.0 + version: 2.9.0(prop-types@15.8.1)(react@16.14.0) + react-intl-redux: + specifier: 0.7.0 + version: 0.7.0(react-intl@2.9.0)(react-redux@5.0.7) + react-modal: + specifier: 3.9.1 + version: 3.9.1(react-dom@16.14.0)(react@16.14.0) + react-popover: + specifier: 0.5.10 + version: 0.5.10 + react-redux: + specifier: 5.0.7 + version: 5.0.7(react@16.14.0)(redux@3.7.2) + react-responsive: + specifier: ^4.1.0 + version: 4.1.0(react@16.14.0) + react-string-replace: + specifier: ^0.4.4 + version: 0.4.4 + react-style-proptype: + specifier: 3.2.2 + version: 3.2.2 + react-tabs: + specifier: 2.3.0 + version: 2.3.0(react@16.14.0) + react-tooltip: + specifier: 3.8.0 + version: 3.8.0(react-dom@16.14.0)(react@16.14.0) + react-virtualized: + specifier: 9.20.1 + version: 9.20.1(react-dom@16.14.0)(react@16.14.0) + redux: + specifier: 3.7.2 + version: 3.7.2 + redux-throttle: + specifier: 0.1.1 + version: 0.1.1 + scratch-audio: + specifier: github:PenguinMod/PenguinMod-Audio#develop + version: github.com/PenguinMod/PenguinMod-Audio/67c441461c16fed75c471abb1213b7b919badb6c + scratch-blocks: + specifier: github:PenguinMod/PenguinMod-Blocks#develop-builds + version: github.com/PenguinMod/PenguinMod-Blocks/898ffafdb69df711e56e3362686badd3e4553bfb + scratch-paint: + specifier: github:PenguinMod/PenguinMod-Paint#develop + version: github.com/PenguinMod/PenguinMod-Paint/e4bd0050300d2597f5037e75ea3697d970e7baf7(react-dom@16.14.0)(react-intl-redux@0.7.0)(react-intl@2.9.0)(react-popover@0.5.10)(react-redux@5.0.7)(react-responsive@4.1.0)(react-style-proptype@3.2.2)(react-tooltip@3.8.0)(react@16.14.0)(redux@3.7.2)(scratch-render-fonts@1.0.0-prerelease.20210401210003) + scratch-render: + specifier: github:PenguinMod/PenguinMod-Render#develop + version: github.com/PenguinMod/PenguinMod-Render/f73221d7efde3d39077470ecb5431bf9a6a33a53(scratch-render-fonts@1.0.0-prerelease.20210401210003) + scratch-render-fonts: + specifier: 1.0.0-prerelease.20210401210003 + version: 1.0.0-prerelease.20210401210003 + scratch-storage: + specifier: github:PenguinMod/PenguinMod-Storage#develop + version: github.com/PenguinMod/PenguinMod-Storage/96f45f701dc11648bc88fcc5307193d591afea84(webpack@4.46.0) + scratch-svg-renderer: + specifier: github:TurboWarp/scratch-svg-renderer#develop + version: github.com/TurboWarp/scratch-svg-renderer/62fe825405a451ab981c33d601d5c6c3581ced69(scratch-render-fonts@1.0.0-prerelease.20210401210003) + scratch-vm: + specifier: github:PenguinMod/PenguinMod-Vm#develop + version: github.com/PenguinMod/PenguinMod-Vm/e4dc0bbbdda4b5546beadd482cd3cbef8c7525c0(@turbowarp/scratch-svg-renderer@1.0.0)(webpack@4.46.0) + startaudiocontext: + specifier: 1.2.1 + version: 1.2.1 + style-loader: + specifier: ^0.23.1 + version: 0.23.1 + text-encoding: + specifier: 0.7.0 + version: 0.7.0 + theia: + specifier: github:FreshPenguin112/theia-pnpm#master + version: github.com/FreshPenguin112/theia-pnpm/13571e769ea006f4061f0eaf316cf3c7d214bad6 + to-style: + specifier: 1.3.3 + version: 1.3.3 + wav-encoder: + specifier: 1.3.0 + version: 1.3.0 + xhr: + specifier: 2.5.0 + version: 2.5.0 + +devDependencies: + '@babel/cli': + specifier: 7.14.8 + version: 7.14.8(@babel/core@7.14.8) + '@babel/core': + specifier: 7.14.8 + version: 7.14.8 + '@babel/plugin-proposal-object-rest-spread': + specifier: 7.14.7 + version: 7.14.7(@babel/core@7.14.8) + '@babel/plugin-syntax-dynamic-import': + specifier: 7.2.0 + version: 7.2.0(@babel/core@7.14.8) + '@babel/plugin-transform-async-to-generator': + specifier: 7.14.5 + version: 7.14.5(@babel/core@7.14.8) + '@babel/preset-env': + specifier: 7.14.8 + version: 7.14.8(@babel/core@7.14.8) + '@babel/preset-react': + specifier: 7.14.5 + version: 7.14.5(@babel/core@7.14.8) + babel-core: + specifier: 7.0.0-bridge.0 + version: 7.0.0-bridge.0(@babel/core@7.14.8) + babel-eslint: + specifier: 10.0.3 + version: 10.0.3(eslint@5.16.0) + babel-loader: + specifier: 8.2.2 + version: 8.2.2(@babel/core@7.14.8)(webpack@4.46.0) + chromedriver: + specifier: 105.0.0 + version: 105.0.0 + enzyme: + specifier: 3.10.0 + version: 3.10.0 + enzyme-adapter-react-16: + specifier: 1.3.0 + version: 1.3.0(enzyme@3.10.0)(react-dom@16.14.0)(react@16.14.0) + eslint: + specifier: 5.16.0 + version: 5.16.0 + eslint-config-scratch: + specifier: 6.0.0 + version: 6.0.0(babel-eslint@10.0.3)(eslint@5.16.0) + eslint-import-resolver-webpack: + specifier: 0.11.1 + version: 0.11.1(eslint-plugin-import@2.23.4)(webpack@4.46.0) + eslint-plugin-import: + specifier: 2.23.4 + version: 2.23.4(eslint-import-resolver-webpack@0.11.1)(eslint@5.16.0) + eslint-plugin-jest: + specifier: 22.17.0 + version: 22.17.0(eslint@5.16.0) + eslint-plugin-react: + specifier: 7.24.0 + version: 7.24.0(eslint@5.16.0) + gh-pages: + specifier: 3.2.3 + version: 3.2.3 + gh-pages-webpack-plugin: + specifier: github:FreshPenguin112/gh-pages-webpack-plugin + version: github.com/FreshPenguin112/gh-pages-webpack-plugin/af8291f79f5e90f62c4f312d1fc5e4a8a2aec5b0 + html-webpack-plugin: + specifier: ^4.5.2 + version: 4.5.2(webpack@4.46.0) + jest: + specifier: 21.2.1 + version: 21.2.1 + jest-junit: + specifier: 7.0.0 + version: 7.0.0 + lodash.defaultsdeep: + specifier: 4.6.1 + version: 4.6.1 + mkdirp: + specifier: 1.0.3 + version: 1.0.3 + raf: + specifier: 3.4.1 + version: 3.4.1 + react-test-renderer: + specifier: 16.2.0 + version: 16.2.0(react@16.14.0) + redux-mock-store: + specifier: 1.5.3 + version: 1.5.3 + rimraf: + specifier: 2.7.1 + version: 2.7.1 + selenium-webdriver: + specifier: 3.6.0 + version: 3.6.0 + uglifyjs-webpack-plugin: + specifier: 1.3.0 + version: 1.3.0(webpack@4.46.0) + url-loader: + specifier: ^4.1.1 + version: 4.1.1(file-loader@2.0.0)(webpack@4.46.0) + web-audio-test-api: + specifier: 0.5.2 + version: 0.5.2 + webpack: + specifier: 4.46.0 + version: 4.46.0(webpack-cli@3.3.12) + webpack-cli: + specifier: 3.3.12 + version: 3.3.12(webpack@4.46.0) + webpack-dev-server: + specifier: 3.11.2 + version: 3.11.2(webpack-cli@3.3.12)(webpack@4.46.0) + webpack-sources: + specifier: 3.2.3 + version: 3.2.3 + +packages: + + /@babel/cli@7.14.8(@babel/core@7.14.8): + resolution: {integrity: sha512-lcy6Lymft9Rpfqmrqdd4oTDdUx9ZwaAhAfywVrHG4771Pa6PPT0danJ1kDHBXYqh4HHSmIdA+nlmfxfxSDPtBg==} + engines: {node: '>=6.9.0'} + hasBin: true + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.14.8 + commander: 4.1.1 + convert-source-map: 1.9.0 + fs-readdir-recursive: 1.1.0 + glob: 7.2.3 + make-dir: 2.1.0 + slash: 2.0.0 + source-map: 0.5.7 + optionalDependencies: + '@nicolo-ribaudo/chokidar-2': 2.1.8-no-fsevents.2 + chokidar: 3.5.3 + transitivePeerDependencies: + - supports-color + + /@babel/code-frame@7.23.5: + resolution: {integrity: sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': 7.23.4 + chalk: 2.4.2 + + /@babel/compat-data@7.23.5: + resolution: {integrity: sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==} + engines: {node: '>=6.9.0'} + + /@babel/core@7.14.8: + resolution: {integrity: sha512-/AtaeEhT6ErpDhInbXmjHcUQXH0L0TEgscfcxk1qbOvLuKCa5aZT0SOOtDKFY96/CLROwbLSKyFor6idgNaU4Q==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.23.5 + '@babel/generator': 7.23.6 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.14.8) + '@babel/helpers': 7.23.7 + '@babel/parser': 7.23.6 + '@babel/template': 7.22.15 + '@babel/traverse': 7.23.7 + '@babel/types': 7.23.6 + convert-source-map: 1.9.0 + debug: 4.3.4(supports-color@6.1.0) + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + source-map: 0.5.7 + transitivePeerDependencies: + - supports-color + + /@babel/generator@7.23.6: + resolution: {integrity: sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.6 + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.20 + jsesc: 2.5.2 + + /@babel/helper-annotate-as-pure@7.22.5: + resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.6 + dev: true + + /@babel/helper-builder-binary-assignment-operator-visitor@7.22.15: + resolution: {integrity: sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.6 + dev: true + + /@babel/helper-compilation-targets@7.23.6: + resolution: {integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/compat-data': 7.23.5 + '@babel/helper-validator-option': 7.23.5 + browserslist: 4.22.2 + lru-cache: 5.1.1 + semver: 6.3.1 + + /@babel/helper-create-class-features-plugin@7.23.7(@babel/core@7.14.8): + resolution: {integrity: sha512-xCoqR/8+BoNnXOY7RVSgv6X+o7pmT5q1d+gGcRlXYkI+9B31glE4jeejhKVpA04O1AtzOt7OSQ6VYKP5FcRl9g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.14.8 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-member-expression-to-functions': 7.23.0 + '@babel/helper-optimise-call-expression': 7.22.5 + '@babel/helper-replace-supers': 7.22.20(@babel/core@7.14.8) + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + semver: 6.3.1 + dev: true + + /@babel/helper-create-regexp-features-plugin@7.22.15(@babel/core@7.14.8): + resolution: {integrity: sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.14.8 + '@babel/helper-annotate-as-pure': 7.22.5 + regexpu-core: 5.3.2 + semver: 6.3.1 + dev: true + + /@babel/helper-define-polyfill-provider@0.2.4(@babel/core@7.14.8): + resolution: {integrity: sha512-OrpPZ97s+aPi6h2n1OXzdhVis1SGSsMU2aMHgLcOKfsp4/v1NWpx3CWT3lBj5eeBq9cDkPkh+YCfdF7O12uNDQ==} + peerDependencies: + '@babel/core': ^7.4.0-0 + dependencies: + '@babel/core': 7.14.8 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/traverse': 7.23.7 + debug: 4.3.4(supports-color@6.1.0) + lodash.debounce: 4.0.8 + resolve: 1.22.8 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-environment-visitor@7.22.20: + resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} + engines: {node: '>=6.9.0'} + + /@babel/helper-function-name@7.23.0: + resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.22.15 + '@babel/types': 7.23.6 + + /@babel/helper-hoist-variables@7.22.5: + resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.6 + + /@babel/helper-member-expression-to-functions@7.23.0: + resolution: {integrity: sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.6 + dev: true + + /@babel/helper-module-imports@7.22.15: + resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.6 + + /@babel/helper-module-transforms@7.23.3(@babel/core@7.14.8): + resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.14.8 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-simple-access': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/helper-validator-identifier': 7.22.20 + + /@babel/helper-optimise-call-expression@7.22.5: + resolution: {integrity: sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.6 + dev: true + + /@babel/helper-plugin-utils@7.22.5: + resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} + engines: {node: '>=6.9.0'} + + /@babel/helper-remap-async-to-generator@7.22.20(@babel/core@7.14.8): + resolution: {integrity: sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.14.8 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-wrap-function': 7.22.20 + dev: true + + /@babel/helper-replace-supers@7.22.20(@babel/core@7.14.8): + resolution: {integrity: sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.14.8 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-member-expression-to-functions': 7.23.0 + '@babel/helper-optimise-call-expression': 7.22.5 + dev: true + + /@babel/helper-simple-access@7.22.5: + resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.6 + + /@babel/helper-skip-transparent-expression-wrappers@7.22.5: + resolution: {integrity: sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.6 + dev: true + + /@babel/helper-split-export-declaration@7.22.6: + resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.6 + + /@babel/helper-string-parser@7.23.4: + resolution: {integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==} + engines: {node: '>=6.9.0'} + + /@babel/helper-validator-identifier@7.22.20: + resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} + engines: {node: '>=6.9.0'} + + /@babel/helper-validator-option@7.23.5: + resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==} + engines: {node: '>=6.9.0'} + + /@babel/helper-wrap-function@7.22.20: + resolution: {integrity: sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-function-name': 7.23.0 + '@babel/template': 7.22.15 + '@babel/types': 7.23.6 + dev: true + + /@babel/helpers@7.23.7: + resolution: {integrity: sha512-6AMnjCoC8wjqBzDHkuqpa7jAKwvMo4dC+lr/TFBz+ucfulO1XMpDnwWPGBNwClOKZ8h6xn5N81W/R5OrcKtCbQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.22.15 + '@babel/traverse': 7.23.7 + '@babel/types': 7.23.6 + transitivePeerDependencies: + - supports-color + + /@babel/highlight@7.23.4: + resolution: {integrity: sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.22.20 + chalk: 2.4.2 + js-tokens: 4.0.0 + + /@babel/parser@7.23.6: + resolution: {integrity: sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.23.6 + + /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.23.3(@babel/core@7.14.8): + resolution: {integrity: sha512-WwlxbfMNdVEpQjZmK5mhm7oSwD3dS6eU+Iwsi4Knl9wAletWem7kaRsGOG+8UEbRyqxY4SS5zvtfXwX+jMxUwQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.13.0 + dependencies: + '@babel/core': 7.14.8 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/plugin-transform-optional-chaining': 7.23.4(@babel/core@7.14.8) + dev: true + + /@babel/plugin-proposal-async-generator-functions@7.20.7(@babel/core@7.14.8): + resolution: {integrity: sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==} + engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-async-generator-functions instead. + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.14.8 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.14.8) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.14.8) + dev: true + + /@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.14.8): + resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==} + engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead. + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.14.8 + '@babel/helper-create-class-features-plugin': 7.23.7(@babel/core@7.14.8) + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-proposal-class-static-block@7.21.0(@babel/core@7.14.8): + resolution: {integrity: sha512-XP5G9MWNUskFuP30IfFSEFB0Z6HzLIUcjYM4bYOPHXl7eiJ9HFv8tWj6TXTN5QODiEhDZAeI4hLok2iHFFV4hw==} + engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-static-block instead. + peerDependencies: + '@babel/core': ^7.12.0 + dependencies: + '@babel/core': 7.14.8 + '@babel/helper-create-class-features-plugin': 7.23.7(@babel/core@7.14.8) + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.14.8) + dev: true + + /@babel/plugin-proposal-dynamic-import@7.18.6(@babel/core@7.14.8): + resolution: {integrity: sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==} + engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-dynamic-import instead. + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.14.8 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.14.8) + dev: true + + /@babel/plugin-proposal-export-namespace-from@7.18.9(@babel/core@7.14.8): + resolution: {integrity: sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==} + engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-export-namespace-from instead. + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.14.8 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.14.8) + dev: true + + /@babel/plugin-proposal-json-strings@7.18.6(@babel/core@7.14.8): + resolution: {integrity: sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==} + engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-json-strings instead. + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.14.8 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.14.8) + dev: true + + /@babel/plugin-proposal-logical-assignment-operators@7.20.7(@babel/core@7.14.8): + resolution: {integrity: sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==} + engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-logical-assignment-operators instead. + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.14.8 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.14.8) + dev: true + + /@babel/plugin-proposal-nullish-coalescing-operator@7.18.6(@babel/core@7.14.8): + resolution: {integrity: sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==} + engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-nullish-coalescing-operator instead. + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.14.8 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.14.8) + dev: true + + /@babel/plugin-proposal-numeric-separator@7.18.6(@babel/core@7.14.8): + resolution: {integrity: sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==} + engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-numeric-separator instead. + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.14.8 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.14.8) + dev: true + + /@babel/plugin-proposal-object-rest-spread@7.14.7(@babel/core@7.14.8): + resolution: {integrity: sha512-082hsZz+sVabfmDWo1Oct1u1AgbKbUAyVgmX4otIc7bdsRgHBXwTwb3DpDmD4Eyyx6DNiuz5UAATT655k+kL5g==} + engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-object-rest-spread instead. + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': 7.23.5 + '@babel/core': 7.14.8 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.14.8) + '@babel/plugin-transform-parameters': 7.23.3(@babel/core@7.14.8) + dev: true + + /@babel/plugin-proposal-optional-catch-binding@7.18.6(@babel/core@7.14.8): + resolution: {integrity: sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==} + engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-catch-binding instead. + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.14.8 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.14.8) + dev: true + + /@babel/plugin-proposal-optional-chaining@7.21.0(@babel/core@7.14.8): + resolution: {integrity: sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==} + engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-chaining instead. + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.14.8 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.14.8) + dev: true + + /@babel/plugin-proposal-private-methods@7.18.6(@babel/core@7.14.8): + resolution: {integrity: sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==} + engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-methods instead. + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.14.8 + '@babel/helper-create-class-features-plugin': 7.23.7(@babel/core@7.14.8) + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-proposal-private-property-in-object@7.21.11(@babel/core@7.14.8): + resolution: {integrity: sha512-0QZ8qP/3RLDVBwBFoWAwCtgcDZJVwA5LUJRZU8x2YFfKNuFq161wK3cuGrALu5yiPu+vzwTAg/sMWVNeWeNyaw==} + engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-property-in-object instead. + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.14.8 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-create-class-features-plugin': 7.23.7(@babel/core@7.14.8) + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.14.8) + dev: true + + /@babel/plugin-proposal-unicode-property-regex@7.18.6(@babel/core@7.14.8): + resolution: {integrity: sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==} + engines: {node: '>=4'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-unicode-property-regex instead. + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.14.8 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.14.8) + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.14.8): + resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.14.8 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.14.8): + resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.14.8 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.14.8): + resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.14.8 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-dynamic-import@7.2.0(@babel/core@7.14.8): + resolution: {integrity: sha512-mVxuJ0YroI/h/tbFTPGZR8cv6ai+STMKNBq0f8hFxsxWjl94qqhsb+wXbpNMDPU3cfR1TIsVFzU3nXyZMqyK4w==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.14.8 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.14.8): + resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.14.8 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.14.8): + resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.14.8 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.14.8): + resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.14.8 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-jsx@7.23.3(@babel/core@7.14.8): + resolution: {integrity: sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.14.8 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.14.8): + resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.14.8 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.14.8): + resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.14.8 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.14.8): + resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.14.8 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.14.8): + resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.14.8 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.14.8): + resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.14.8 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.14.8): + resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.14.8 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.14.8): + resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.14.8 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.14.8): + resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.14.8 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-arrow-functions@7.23.3(@babel/core@7.14.8): + resolution: {integrity: sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.14.8 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-async-to-generator@7.14.5(@babel/core@7.14.8): + resolution: {integrity: sha512-szkbzQ0mNk0rpu76fzDdqSyPu0MuvpXgC+6rz5rpMb5OIRxdmHfQxrktL8CYolL2d8luMCZTR0DpIMIdL27IjA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.14.8 + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.14.8) + dev: true + + /@babel/plugin-transform-block-scoped-functions@7.23.3(@babel/core@7.14.8): + resolution: {integrity: sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.14.8 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-block-scoping@7.23.4(@babel/core@7.14.8): + resolution: {integrity: sha512-0QqbP6B6HOh7/8iNR4CQU2Th/bbRtBp4KS9vcaZd1fZ0wSh5Fyssg0UCIHwxh+ka+pNDREbVLQnHCMHKZfPwfw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.14.8 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-classes@7.23.5(@babel/core@7.14.8): + resolution: {integrity: sha512-jvOTR4nicqYC9yzOHIhXG5emiFEOpappSJAl73SDSEDcybD+Puuze8Tnpb9p9qEyYup24tq891gkaygIFvWDqg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.14.8 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-optimise-call-expression': 7.22.5 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-replace-supers': 7.22.20(@babel/core@7.14.8) + '@babel/helper-split-export-declaration': 7.22.6 + globals: 11.12.0 + dev: true + + /@babel/plugin-transform-computed-properties@7.23.3(@babel/core@7.14.8): + resolution: {integrity: sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.14.8 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/template': 7.22.15 + dev: true + + /@babel/plugin-transform-destructuring@7.23.3(@babel/core@7.14.8): + resolution: {integrity: sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.14.8 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-dotall-regex@7.23.3(@babel/core@7.14.8): + resolution: {integrity: sha512-vgnFYDHAKzFaTVp+mneDsIEbnJ2Np/9ng9iviHw3P/KVcgONxpNULEW/51Z/BaFojG2GI2GwwXck5uV1+1NOYQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.14.8 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.14.8) + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-duplicate-keys@7.23.3(@babel/core@7.14.8): + resolution: {integrity: sha512-RrqQ+BQmU3Oyav3J+7/myfvRCq7Tbz+kKLLshUmMwNlDHExbGL7ARhajvoBJEvc+fCguPPu887N+3RRXBVKZUA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.14.8 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-exponentiation-operator@7.23.3(@babel/core@7.14.8): + resolution: {integrity: sha512-5fhCsl1odX96u7ILKHBj4/Y8vipoqwsJMh4csSA8qFfxrZDEA4Ssku2DyNvMJSmZNOEBT750LfFPbtrnTP90BQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.14.8 + '@babel/helper-builder-binary-assignment-operator-visitor': 7.22.15 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-for-of@7.23.6(@babel/core@7.14.8): + resolution: {integrity: sha512-aYH4ytZ0qSuBbpfhuofbg/e96oQ7U2w1Aw/UQmKT+1l39uEhUPoFS3fHevDc1G0OvewyDudfMKY1OulczHzWIw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.14.8 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + dev: true + + /@babel/plugin-transform-function-name@7.23.3(@babel/core@7.14.8): + resolution: {integrity: sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.14.8 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-literals@7.23.3(@babel/core@7.14.8): + resolution: {integrity: sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.14.8 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-member-expression-literals@7.23.3(@babel/core@7.14.8): + resolution: {integrity: sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.14.8 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-modules-amd@7.23.3(@babel/core@7.14.8): + resolution: {integrity: sha512-vJYQGxeKM4t8hYCKVBlZX/gtIY2I7mRGFNcm85sgXGMTBcoV3QdVtdpbcWEbzbfUIUZKwvgFT82mRvaQIebZzw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.14.8 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.14.8) + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-modules-commonjs@7.23.3(@babel/core@7.14.8): + resolution: {integrity: sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.14.8 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.14.8) + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-simple-access': 7.22.5 + dev: true + + /@babel/plugin-transform-modules-systemjs@7.23.3(@babel/core@7.14.8): + resolution: {integrity: sha512-ZxyKGTkF9xT9YJuKQRo19ewf3pXpopuYQd8cDXqNzc3mUNbOME0RKMoZxviQk74hwzfQsEe66dE92MaZbdHKNQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.14.8 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.14.8) + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-validator-identifier': 7.22.20 + dev: true + + /@babel/plugin-transform-modules-umd@7.23.3(@babel/core@7.14.8): + resolution: {integrity: sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.14.8 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.14.8) + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-named-capturing-groups-regex@7.22.5(@babel/core@7.14.8): + resolution: {integrity: sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.14.8 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.14.8) + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-new-target@7.23.3(@babel/core@7.14.8): + resolution: {integrity: sha512-YJ3xKqtJMAT5/TIZnpAR3I+K+WaDowYbN3xyxI8zxx/Gsypwf9B9h0VB+1Nh6ACAAPRS5NSRje0uVv5i79HYGQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.14.8 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-object-super@7.23.3(@babel/core@7.14.8): + resolution: {integrity: sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.14.8 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-replace-supers': 7.22.20(@babel/core@7.14.8) + dev: true + + /@babel/plugin-transform-optional-chaining@7.23.4(@babel/core@7.14.8): + resolution: {integrity: sha512-ZU8y5zWOfjM5vZ+asjgAPwDaBjJzgufjES89Rs4Lpq63O300R/kOz30WCLo6BxxX6QVEilwSlpClnG5cZaikTA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.14.8 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.14.8) + dev: true + + /@babel/plugin-transform-parameters@7.23.3(@babel/core@7.14.8): + resolution: {integrity: sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.14.8 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-property-literals@7.23.3(@babel/core@7.14.8): + resolution: {integrity: sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.14.8 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-react-display-name@7.23.3(@babel/core@7.14.8): + resolution: {integrity: sha512-GnvhtVfA2OAtzdX58FJxU19rhoGeQzyVndw3GgtdECQvQFXPEZIOVULHVZGAYmOgmqjXpVpfocAbSjh99V/Fqw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.14.8 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-react-jsx-development@7.22.5(@babel/core@7.14.8): + resolution: {integrity: sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.14.8 + '@babel/plugin-transform-react-jsx': 7.23.4(@babel/core@7.14.8) + dev: true + + /@babel/plugin-transform-react-jsx@7.23.4(@babel/core@7.14.8): + resolution: {integrity: sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.14.8 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-jsx': 7.23.3(@babel/core@7.14.8) + '@babel/types': 7.23.6 + dev: true + + /@babel/plugin-transform-react-pure-annotations@7.23.3(@babel/core@7.14.8): + resolution: {integrity: sha512-qMFdSS+TUhB7Q/3HVPnEdYJDQIk57jkntAwSuz9xfSE4n+3I+vHYCli3HoHawN1Z3RfCz/y1zXA/JXjG6cVImQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.14.8 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-regenerator@7.23.3(@babel/core@7.14.8): + resolution: {integrity: sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.14.8 + '@babel/helper-plugin-utils': 7.22.5 + regenerator-transform: 0.15.2 + dev: true + + /@babel/plugin-transform-reserved-words@7.23.3(@babel/core@7.14.8): + resolution: {integrity: sha512-QnNTazY54YqgGxwIexMZva9gqbPa15t/x9VS+0fsEFWplwVpXYZivtgl43Z1vMpc1bdPP2PP8siFeVcnFvA3Cg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.14.8 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-shorthand-properties@7.23.3(@babel/core@7.14.8): + resolution: {integrity: sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.14.8 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-spread@7.23.3(@babel/core@7.14.8): + resolution: {integrity: sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.14.8 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + dev: true + + /@babel/plugin-transform-sticky-regex@7.23.3(@babel/core@7.14.8): + resolution: {integrity: sha512-HZOyN9g+rtvnOU3Yh7kSxXrKbzgrm5X4GncPY1QOquu7epga5MxKHVpYu2hvQnry/H+JjckSYRb93iNfsioAGg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.14.8 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-template-literals@7.23.3(@babel/core@7.14.8): + resolution: {integrity: sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.14.8 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-typeof-symbol@7.23.3(@babel/core@7.14.8): + resolution: {integrity: sha512-4t15ViVnaFdrPC74be1gXBSMzXk3B4Us9lP7uLRQHTFpV5Dvt33pn+2MyyNxmN3VTTm3oTrZVMUmuw3oBnQ2oQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.14.8 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-unicode-escapes@7.23.3(@babel/core@7.14.8): + resolution: {integrity: sha512-OMCUx/bU6ChE3r4+ZdylEqAjaQgHAgipgW8nsCfu5pGqDcFytVd91AwRvUJSBZDz0exPGgnjoqhgRYLRjFZc9Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.14.8 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-unicode-regex@7.23.3(@babel/core@7.14.8): + resolution: {integrity: sha512-wMHpNA4x2cIA32b/ci3AfwNgheiva2W0WUKWTK7vBHBhDKfPsc5cFGNWm69WBqpwd86u1qwZ9PWevKqm1A3yAw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.14.8 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.14.8) + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/preset-env@7.14.8(@babel/core@7.14.8): + resolution: {integrity: sha512-a9aOppDU93oArQ51H+B8M1vH+tayZbuBqzjOhntGetZVa+4tTu5jp+XTwqHGG2lxslqomPYVSjIxQkFwXzgnxg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': 7.23.5 + '@babel/core': 7.14.8 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-validator-option': 7.23.5 + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.23.3(@babel/core@7.14.8) + '@babel/plugin-proposal-async-generator-functions': 7.20.7(@babel/core@7.14.8) + '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.14.8) + '@babel/plugin-proposal-class-static-block': 7.21.0(@babel/core@7.14.8) + '@babel/plugin-proposal-dynamic-import': 7.18.6(@babel/core@7.14.8) + '@babel/plugin-proposal-export-namespace-from': 7.18.9(@babel/core@7.14.8) + '@babel/plugin-proposal-json-strings': 7.18.6(@babel/core@7.14.8) + '@babel/plugin-proposal-logical-assignment-operators': 7.20.7(@babel/core@7.14.8) + '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.14.8) + '@babel/plugin-proposal-numeric-separator': 7.18.6(@babel/core@7.14.8) + '@babel/plugin-proposal-object-rest-spread': 7.14.7(@babel/core@7.14.8) + '@babel/plugin-proposal-optional-catch-binding': 7.18.6(@babel/core@7.14.8) + '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.14.8) + '@babel/plugin-proposal-private-methods': 7.18.6(@babel/core@7.14.8) + '@babel/plugin-proposal-private-property-in-object': 7.21.11(@babel/core@7.14.8) + '@babel/plugin-proposal-unicode-property-regex': 7.18.6(@babel/core@7.14.8) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.14.8) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.14.8) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.14.8) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.14.8) + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.14.8) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.14.8) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.14.8) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.14.8) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.14.8) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.14.8) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.14.8) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.14.8) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.14.8) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.14.8) + '@babel/plugin-transform-arrow-functions': 7.23.3(@babel/core@7.14.8) + '@babel/plugin-transform-async-to-generator': 7.14.5(@babel/core@7.14.8) + '@babel/plugin-transform-block-scoped-functions': 7.23.3(@babel/core@7.14.8) + '@babel/plugin-transform-block-scoping': 7.23.4(@babel/core@7.14.8) + '@babel/plugin-transform-classes': 7.23.5(@babel/core@7.14.8) + '@babel/plugin-transform-computed-properties': 7.23.3(@babel/core@7.14.8) + '@babel/plugin-transform-destructuring': 7.23.3(@babel/core@7.14.8) + '@babel/plugin-transform-dotall-regex': 7.23.3(@babel/core@7.14.8) + '@babel/plugin-transform-duplicate-keys': 7.23.3(@babel/core@7.14.8) + '@babel/plugin-transform-exponentiation-operator': 7.23.3(@babel/core@7.14.8) + '@babel/plugin-transform-for-of': 7.23.6(@babel/core@7.14.8) + '@babel/plugin-transform-function-name': 7.23.3(@babel/core@7.14.8) + '@babel/plugin-transform-literals': 7.23.3(@babel/core@7.14.8) + '@babel/plugin-transform-member-expression-literals': 7.23.3(@babel/core@7.14.8) + '@babel/plugin-transform-modules-amd': 7.23.3(@babel/core@7.14.8) + '@babel/plugin-transform-modules-commonjs': 7.23.3(@babel/core@7.14.8) + '@babel/plugin-transform-modules-systemjs': 7.23.3(@babel/core@7.14.8) + '@babel/plugin-transform-modules-umd': 7.23.3(@babel/core@7.14.8) + '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.14.8) + '@babel/plugin-transform-new-target': 7.23.3(@babel/core@7.14.8) + '@babel/plugin-transform-object-super': 7.23.3(@babel/core@7.14.8) + '@babel/plugin-transform-parameters': 7.23.3(@babel/core@7.14.8) + '@babel/plugin-transform-property-literals': 7.23.3(@babel/core@7.14.8) + '@babel/plugin-transform-regenerator': 7.23.3(@babel/core@7.14.8) + '@babel/plugin-transform-reserved-words': 7.23.3(@babel/core@7.14.8) + '@babel/plugin-transform-shorthand-properties': 7.23.3(@babel/core@7.14.8) + '@babel/plugin-transform-spread': 7.23.3(@babel/core@7.14.8) + '@babel/plugin-transform-sticky-regex': 7.23.3(@babel/core@7.14.8) + '@babel/plugin-transform-template-literals': 7.23.3(@babel/core@7.14.8) + '@babel/plugin-transform-typeof-symbol': 7.23.3(@babel/core@7.14.8) + '@babel/plugin-transform-unicode-escapes': 7.23.3(@babel/core@7.14.8) + '@babel/plugin-transform-unicode-regex': 7.23.3(@babel/core@7.14.8) + '@babel/preset-modules': 0.1.6(@babel/core@7.14.8) + '@babel/types': 7.23.6 + babel-plugin-polyfill-corejs2: 0.2.3(@babel/core@7.14.8) + babel-plugin-polyfill-corejs3: 0.2.5(@babel/core@7.14.8) + babel-plugin-polyfill-regenerator: 0.2.3(@babel/core@7.14.8) + core-js-compat: 3.35.0 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/preset-modules@0.1.6(@babel/core@7.14.8): + resolution: {integrity: sha512-ID2yj6K/4lKfhuU3+EX4UvNbIt7eACFbHmNUjzA+ep+B5971CknnA/9DEWKbRokfbbtblxxxXFJJrH47UEAMVg==} + peerDependencies: + '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/core': 7.14.8 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-proposal-unicode-property-regex': 7.18.6(@babel/core@7.14.8) + '@babel/plugin-transform-dotall-regex': 7.23.3(@babel/core@7.14.8) + '@babel/types': 7.23.6 + esutils: 2.0.3 + dev: true + + /@babel/preset-react@7.14.5(@babel/core@7.14.8): + resolution: {integrity: sha512-XFxBkjyObLvBaAvkx1Ie95Iaq4S/GUEIrejyrntQ/VCMKUYvKLoyKxOBzJ2kjA3b6rC9/KL6KXfDC2GqvLiNqQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.14.8 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-validator-option': 7.23.5 + '@babel/plugin-transform-react-display-name': 7.23.3(@babel/core@7.14.8) + '@babel/plugin-transform-react-jsx': 7.23.4(@babel/core@7.14.8) + '@babel/plugin-transform-react-jsx-development': 7.22.5(@babel/core@7.14.8) + '@babel/plugin-transform-react-pure-annotations': 7.23.3(@babel/core@7.14.8) + dev: true + + /@babel/regjsgen@0.8.0: + resolution: {integrity: sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==} + dev: true + + /@babel/runtime@7.23.7: + resolution: {integrity: sha512-w06OXVOFso7LcbzMiDGt+3X7Rh7Ho8MmgPoWU3rarH+8upf+wSU/grlGbWzQyr3DkdN6ZeuMFjpdwW0Q+HxobA==} + engines: {node: '>=6.9.0'} + dependencies: + regenerator-runtime: 0.14.1 + + /@babel/template@7.22.15: + resolution: {integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.23.5 + '@babel/parser': 7.23.6 + '@babel/types': 7.23.6 + + /@babel/traverse@7.23.7: + resolution: {integrity: sha512-tY3mM8rH9jM0YHFGyfC0/xf+SB5eKUu7HPj7/k3fpi9dAlsMc5YbQvDi0Sh2QTPXqMhyaAtzAr807TIyfQrmyg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.23.5 + '@babel/generator': 7.23.6 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/parser': 7.23.6 + '@babel/types': 7.23.6 + debug: 4.3.4(supports-color@6.1.0) + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + /@babel/types@7.23.6: + resolution: {integrity: sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.23.4 + '@babel/helper-validator-identifier': 7.22.20 + to-fast-properties: 2.0.0 + + /@gar/promisify@1.1.3: + resolution: {integrity: sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==} + dev: false + + /@jest/types@24.9.0: + resolution: {integrity: sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==} + engines: {node: '>= 6'} + dependencies: + '@types/istanbul-lib-coverage': 2.0.6 + '@types/istanbul-reports': 1.1.2 + '@types/yargs': 13.0.12 + dev: true + + /@jridgewell/gen-mapping@0.3.3: + resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': 1.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.20 + + /@jridgewell/resolve-uri@3.1.1: + resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} + engines: {node: '>=6.0.0'} + + /@jridgewell/set-array@1.1.2: + resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} + engines: {node: '>=6.0.0'} + + /@jridgewell/sourcemap-codec@1.4.15: + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + + /@jridgewell/trace-mapping@0.3.20: + resolution: {integrity: sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==} + dependencies: + '@jridgewell/resolve-uri': 3.1.1 + '@jridgewell/sourcemap-codec': 1.4.15 + + /@nicolo-ribaudo/chokidar-2@2.1.8-no-fsevents.2: + resolution: {integrity: sha512-Fb8WxUFOBQVl+CX4MWet5o7eCc6Pj04rXIwVKZ6h1NnqTo45eOQW6aWyhG25NIODvWFwTDMwBsYxrQ3imxpetg==} + requiresBuild: true + dependencies: + anymatch: 2.0.0(supports-color@6.1.0) + async-each: 1.0.6 + braces: 2.3.2(supports-color@6.1.0) + glob-parent: 5.1.2 + inherits: 2.0.4 + is-binary-path: 1.0.1 + is-glob: 4.0.3 + normalize-path: 3.0.0 + path-is-absolute: 1.0.1 + readdirp: 2.2.1(supports-color@6.1.0) + upath: 1.2.0 + transitivePeerDependencies: + - supports-color + optional: true + + /@nodelib/fs.scandir@2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + /@nodelib/fs.stat@2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + /@nodelib/fs.walk@1.2.8: + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.16.0 + + /@npmcli/fs@1.1.1: + resolution: {integrity: sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==} + dependencies: + '@gar/promisify': 1.1.3 + semver: 7.5.4 + dev: false + + /@npmcli/move-file@1.1.2: + resolution: {integrity: sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==} + engines: {node: '>=10'} + deprecated: This functionality has been moved to @npmcli/fs + dependencies: + mkdirp: 1.0.4 + rimraf: 3.0.2 + dev: false + + /@scratch/paper@0.11.20200728195508: + resolution: {integrity: sha512-cphYw/y/l36UJ8fv/LXyK+lHlxMXtoydJUsgA4u5QnaUaSZYepuSHik6PewJGT4qvaPwT5ImvHWwX2kElWXvoQ==} + engines: {node: '>=8.0.0'} + dev: false + + /@sindresorhus/is@0.7.0: + resolution: {integrity: sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow==} + engines: {node: '>=4'} + dev: false + + /@testim/chrome-version@1.1.4: + resolution: {integrity: sha512-kIhULpw9TrGYnHp/8VfdcneIcxKnLixmADtukQRtJUmsVlMg0niMkwV0xZmi8hqa57xqilIHjWFA0GKvEjVU5g==} + dev: true + + /@transifex/api@4.2.5: + resolution: {integrity: sha512-br8ubTnKohECW3dPrR3h1casERTn3EvaV+gpHkWDZf3rlurkksAvEh/i9U+fIUzBF6ooYI0SG1JjRzuKkeaSZg==} + engines: {node: '>=14.0.0'} + dependencies: + core-js: 3.35.0 + dev: false + + /@turbowarp/json@0.1.2: + resolution: {integrity: sha512-9nWywp+0SH7ROVzQPQQO9gMWBikahsqyMWp1Ku8VV0q+q6bnx6dS0aNPTjqTtF2GHAY55hcREsqKzaoUdWBSwg==} + dev: false + + /@turbowarp/scratch-l10n@3.1000.20230326022803: + resolution: {integrity: sha512-DLgjLKL+w6ggSHtWYtV0Yr21CeWLn4ujwLJ03Gqzpov4FtijhjaHwJjo++JFILqvPteGO/uIhHz9xv5gnR9XTg==} + hasBin: true + dependencies: + '@babel/cli': 7.14.8(@babel/core@7.14.8) + '@babel/core': 7.14.8 + '@transifex/api': 4.2.5 + babel-plugin-react-intl: 3.5.1 + download: 8.0.0 + transifex: 1.6.6 + transitivePeerDependencies: + - supports-color + dev: false + + /@types/babel__core@7.20.5: + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + dependencies: + '@babel/parser': 7.23.6 + '@babel/types': 7.23.6 + '@types/babel__generator': 7.6.8 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.20.5 + dev: false + + /@types/babel__generator@7.6.8: + resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} + dependencies: + '@babel/types': 7.23.6 + dev: false + + /@types/babel__template@7.4.4: + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + dependencies: + '@babel/parser': 7.23.6 + '@babel/types': 7.23.6 + dev: false + + /@types/babel__traverse@7.20.5: + resolution: {integrity: sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==} + dependencies: + '@babel/types': 7.23.6 + dev: false + + /@types/glob@7.2.0: + resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} + dependencies: + '@types/minimatch': 5.1.2 + '@types/node': 20.10.6 + dev: true + + /@types/html-minifier-terser@5.1.2: + resolution: {integrity: sha512-h4lTMgMJctJybDp8CQrxTUiiYmedihHWkjnF/8Pxseu2S6Nlfcy8kwboQ8yejh456rP2yWoEVm1sS/FVsfM48w==} + dev: true + + /@types/istanbul-lib-coverage@2.0.6: + resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} + dev: true + + /@types/istanbul-lib-report@3.0.3: + resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} + dependencies: + '@types/istanbul-lib-coverage': 2.0.6 + dev: true + + /@types/istanbul-reports@1.1.2: + resolution: {integrity: sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==} + dependencies: + '@types/istanbul-lib-coverage': 2.0.6 + '@types/istanbul-lib-report': 3.0.3 + dev: true + + /@types/json-schema@7.0.15: + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + /@types/json5@0.0.29: + resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + dev: true + + /@types/keyv@3.1.4: + resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} + dependencies: + '@types/node': 20.10.6 + dev: false + + /@types/minimatch@5.1.2: + resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} + dev: true + + /@types/node@20.10.6: + resolution: {integrity: sha512-Vac8H+NlRNNlAmDfGUP7b5h/KA+AtWIzuXy0E6OyP8f1tCLYAtPvKRRDJjAPqhpCb0t6U2j7/xqAuLEebW2kiw==} + dependencies: + undici-types: 5.26.5 + + /@types/responselike@1.0.3: + resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} + dependencies: + '@types/node': 20.10.6 + dev: false + + /@types/source-list-map@0.1.6: + resolution: {integrity: sha512-5JcVt1u5HDmlXkwOD2nslZVllBBc7HDuOICfiZah2Z0is8M8g+ddAEawbmd3VjedfDHBzxCaXLs07QEmb7y54g==} + dev: true + + /@types/tapable@1.0.12: + resolution: {integrity: sha512-bTHG8fcxEqv1M9+TD14P8ok8hjxoOCkfKc8XXLaaD05kI7ohpeI956jtDOD3XHKBQrlyPughUtzm1jtVhHpA5Q==} + dev: true + + /@types/uglify-js@3.17.4: + resolution: {integrity: sha512-Hm/T0kV3ywpJyMGNbsItdivRhYNCQQf1IIsYsXnoVPES4t+FMLyDe0/K+Ea7ahWtMtSNb22ZdY7MIyoD9rqARg==} + dependencies: + source-map: 0.6.1 + dev: true + + /@types/webpack-sources@3.2.3: + resolution: {integrity: sha512-4nZOdMwSPHZ4pTEZzSp0AsTM4K7Qmu40UKW4tJDiOVs20UzYF9l+qUe4s0ftfN0pin06n+5cWWDJXH+sbhAiDw==} + dependencies: + '@types/node': 20.10.6 + '@types/source-list-map': 0.1.6 + source-map: 0.7.4 + dev: true + + /@types/webpack@4.41.38: + resolution: {integrity: sha512-oOW7E931XJU1mVfCnxCVgv8GLFL768pDO5u2Gzk82i8yTIgX6i7cntyZOkZYb/JtYM8252SN9bQp9tgkVDSsRw==} + dependencies: + '@types/node': 20.10.6 + '@types/tapable': 1.0.12 + '@types/uglify-js': 3.17.4 + '@types/webpack-sources': 3.2.3 + anymatch: 3.1.3 + source-map: 0.6.1 + dev: true + + /@types/yargs-parser@21.0.3: + resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} + dev: true + + /@types/yargs@13.0.12: + resolution: {integrity: sha512-qCxJE1qgz2y0hA4pIxjBR+PelCH0U5CK1XJXFwCNqfmliatKp47UCXXE9Dyk1OXBDLvsCF57TqQEJaeLfDYEOQ==} + dependencies: + '@types/yargs-parser': 21.0.3 + dev: true + + /@types/yauzl@2.10.3: + resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} + requiresBuild: true + dependencies: + '@types/node': 20.10.6 + dev: true + optional: true + + /@typescript-eslint/experimental-utils@1.13.0(eslint@5.16.0): + resolution: {integrity: sha512-zmpS6SyqG4ZF64ffaJ6uah6tWWWgZ8m+c54XXgwFtUv0jNz8aJAVx8chMCvnk7yl6xwn8d+d96+tWp7fXzTuDg==} + engines: {node: ^6.14.0 || ^8.10.0 || >=9.10.0} + peerDependencies: + eslint: '*' + dependencies: + '@types/json-schema': 7.0.15 + '@typescript-eslint/typescript-estree': 1.13.0 + eslint: 5.16.0 + eslint-scope: 4.0.3 + dev: true + + /@typescript-eslint/typescript-estree@1.13.0: + resolution: {integrity: sha512-b5rCmd2e6DCC6tCTN9GSUAuxdYwCM/k/2wdjHGrIRGPSJotWMCe/dGpi66u42bhuh8q3QBzqM4TMA1GUUCJvdw==} + engines: {node: '>=6.14.0'} + dependencies: + lodash.unescape: 4.0.1 + semver: 5.5.0 + dev: true + + /@vernier/godirect@1.5.0: + resolution: {integrity: sha512-vMS0fQubI3WSSLg1Ry3aey/qWCl9XoCsFzgwOWYkeJs45YxjPel+42pLh5pO7uP6oF47sjZUKx8kGOoTiiiirA==} + dev: false + + /@webassemblyjs/ast@1.9.0: + resolution: {integrity: sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==} + dependencies: + '@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@1.9.0: + resolution: {integrity: sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==} + + /@webassemblyjs/helper-api-error@1.9.0: + resolution: {integrity: sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==} + + /@webassemblyjs/helper-buffer@1.9.0: + resolution: {integrity: sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==} + + /@webassemblyjs/helper-code-frame@1.9.0: + resolution: {integrity: sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==} + dependencies: + '@webassemblyjs/wast-printer': 1.9.0 + + /@webassemblyjs/helper-fsm@1.9.0: + resolution: {integrity: sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==} + + /@webassemblyjs/helper-module-context@1.9.0: + resolution: {integrity: sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==} + dependencies: + '@webassemblyjs/ast': 1.9.0 + + /@webassemblyjs/helper-wasm-bytecode@1.9.0: + resolution: {integrity: sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==} + + /@webassemblyjs/helper-wasm-section@1.9.0: + resolution: {integrity: sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==} + 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 + + /@webassemblyjs/ieee754@1.9.0: + resolution: {integrity: sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==} + dependencies: + '@xtuc/ieee754': 1.2.0 + + /@webassemblyjs/leb128@1.9.0: + resolution: {integrity: sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==} + dependencies: + '@xtuc/long': 4.2.2 + + /@webassemblyjs/utf8@1.9.0: + resolution: {integrity: sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==} + + /@webassemblyjs/wasm-edit@1.9.0: + resolution: {integrity: sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==} + 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 + + /@webassemblyjs/wasm-gen@1.9.0: + resolution: {integrity: sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==} + 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 + + /@webassemblyjs/wasm-opt@1.9.0: + resolution: {integrity: sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==} + dependencies: + '@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@1.9.0: + resolution: {integrity: sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==} + 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 + + /@webassemblyjs/wast-parser@1.9.0: + resolution: {integrity: sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==} + 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 + + /@webassemblyjs/wast-printer@1.9.0: + resolution: {integrity: sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==} + dependencies: + '@webassemblyjs/ast': 1.9.0 + '@webassemblyjs/wast-parser': 1.9.0 + '@xtuc/long': 4.2.2 + + /@xtuc/ieee754@1.2.0: + resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} + + /@xtuc/long@4.2.2: + resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} + + /abab@1.0.4: + resolution: {integrity: sha512-I+Wi+qiE2kUXyrRhNsWv6XsjUTBJjSoVSctKNBfLG5zG/Xe7Rjbxf13+vqYHNTwHaFU+FtSlVxOCTiMEVtPv0A==} + deprecated: Use your platform's native atob() and btoa() methods instead + dev: true + + /accepts@1.3.8: + resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + engines: {node: '>= 0.6'} + dependencies: + mime-types: 2.1.35 + negotiator: 0.6.3 + dev: true + + /acorn-globals@3.1.0: + resolution: {integrity: sha512-uWttZCk96+7itPxK8xCzY86PnxKTMrReKDqrHzv42VQY0K30PUO8WY13WMOuI+cOdX4EIdzdvQ8k6jkuGRFMYw==} + dependencies: + acorn: 4.0.13 + dev: true + + /acorn-jsx@5.3.2(acorn@6.4.2): + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: 6.4.2 + dev: true + + /acorn@4.0.13: + resolution: {integrity: sha512-fu2ygVGuMmlzG8ZeRJ0bvR41nsAkxxhbyk8bZ1SS521Z7vmgJFTQQlfz/Mp/nJexGBz+v8sC9bM6+lNgskt4Ug==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + + /acorn@6.4.2: + resolution: {integrity: sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==} + engines: {node: '>=0.4.0'} + hasBin: true + + /acorn@7.4.1: + resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: false + + /acorn@8.11.3: + resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} + engines: {node: '>=0.4.0'} + hasBin: true + + /agent-base@6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} + dependencies: + debug: 4.3.4(supports-color@6.1.0) + transitivePeerDependencies: + - supports-color + dev: true + + /aggregate-error@3.1.0: + resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} + engines: {node: '>=8'} + dependencies: + clean-stack: 2.2.0 + indent-string: 4.0.0 + + /airbnb-prop-types@2.16.0(react@16.14.0): + resolution: {integrity: sha512-7WHOFolP/6cS96PhKNrslCLMYAI8yB1Pp6u6XmxozQOiZbsI5ycglZr5cHhBFfuRcQQjzCMith5ZPZdYiJCxUg==} + peerDependencies: + react: ^0.14 || ^15.0.0 || ^16.0.0-alpha + dependencies: + array.prototype.find: 2.2.2 + function.prototype.name: 1.1.6 + is-regex: 1.1.4 + object-is: 1.1.5 + object.assign: 4.1.5 + object.entries: 1.1.7 + prop-types: 15.8.1 + prop-types-exact: 1.2.0 + react: 16.14.0 + react-is: 16.13.1 + dev: true + + /ajv-errors@1.0.1(ajv@6.12.6): + resolution: {integrity: sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==} + peerDependencies: + ajv: '>=5.0.0' + dependencies: + ajv: 6.12.6 + + /ajv-keywords@3.5.2(ajv@6.12.6): + resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} + peerDependencies: + ajv: ^6.9.1 + dependencies: + ajv: 6.12.6 + + /ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + /ajv@6.3.0: + resolution: {integrity: sha512-6TQywaGYtRub2fqHkSXfVANlhfja2nbF33wCCHnt3aQstOrtd9jsQGiRUTIOlkEqcxpzRd2akfnqvBBPmLxs8g==} + dependencies: + fast-deep-equal: 1.1.0 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.3.1 + dev: false + + /ansi-colors@3.2.4: + resolution: {integrity: sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==} + engines: {node: '>=6'} + dev: true + + /ansi-escapes@3.2.0: + resolution: {integrity: sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==} + engines: {node: '>=4'} + dev: true + + /ansi-html@0.0.7: + resolution: {integrity: sha512-JoAxEa1DfP9m2xfB/y2r/aKcwXNlltr4+0QSBC4TrLfcxyvepX2Pv0t/xpgGV5bGsDzCYV8SzjWgyCW0T9yYbA==} + engines: {'0': node >= 0.8.0} + hasBin: true + dev: true + + /ansi-regex@1.1.1: + resolution: {integrity: sha512-q5i8bFLg2wDfsuR56c1NzlJFPzVD+9mxhDrhqOGigEFa87OZHlF+9dWeGWzVTP/0ECiA/JUGzfzRr2t3eYORRw==} + engines: {node: '>=0.10.0'} + dev: false + + /ansi-regex@2.1.1: + resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==} + engines: {node: '>=0.10.0'} + + /ansi-regex@3.0.1: + resolution: {integrity: sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==} + engines: {node: '>=4'} + dev: true + + /ansi-regex@4.1.1: + resolution: {integrity: sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==} + engines: {node: '>=6'} + + /ansi-styles@2.2.1: + resolution: {integrity: sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==} + engines: {node: '>=0.10.0'} + + /ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + dependencies: + color-convert: 1.9.3 + + /anymatch@2.0.0(supports-color@6.1.0): + resolution: {integrity: sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==} + dependencies: + micromatch: 3.1.10(supports-color@6.1.0) + normalize-path: 2.1.1 + transitivePeerDependencies: + - supports-color + + /anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + /append-transform@0.4.0: + resolution: {integrity: sha512-Yisb7ew0ZEyDtRYQ+b+26o9KbiYPFxwcsxKzbssigzRRMJ9LpExPVUg6Fos7eP7yP3q7///tzze4nm4lTptPBw==} + engines: {node: '>=0.10.0'} + dependencies: + default-require-extensions: 1.0.0 + dev: true + + /aproba@1.2.0: + resolution: {integrity: sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==} + + /archive-type@4.0.0: + resolution: {integrity: sha512-zV4Ky0v1F8dBrdYElwTvQhweQ0P7Kwc1aluqJsYtOBP01jXcWCyW2IEfI1YiqsG+Iy7ZR+o5LF1N+PGECBxHWA==} + engines: {node: '>=4'} + dependencies: + file-type: 4.4.0 + dev: false + + /argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + dependencies: + sprintf-js: 1.0.3 + + /arr-diff@2.0.0: + resolution: {integrity: sha512-dtXTVMkh6VkEEA7OhXnN1Ecb8aAGFdZ1LFxtOCoqj4qkyOJMt7+qs6Ahdy6p/NQCPYsRSXXivhSB/J5E9jmYKA==} + engines: {node: '>=0.10.0'} + dependencies: + arr-flatten: 1.1.0 + dev: true + + /arr-diff@4.0.0: + resolution: {integrity: sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==} + engines: {node: '>=0.10.0'} + + /arr-flatten@1.1.0: + resolution: {integrity: sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==} + engines: {node: '>=0.10.0'} + + /arr-union@3.1.0: + resolution: {integrity: sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==} + engines: {node: '>=0.10.0'} + + /array-buffer-byte-length@1.0.0: + resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==} + dependencies: + call-bind: 1.0.5 + is-array-buffer: 3.0.2 + dev: true + + /array-equal@1.0.2: + resolution: {integrity: sha512-gUHx76KtnhEgB3HOuFYiCm3FIdEs6ocM2asHvNTkfu/Y09qQVrrVVaOKENmS2KkSaGoxgXNqC+ZVtR/n0MOkSA==} + dev: true + + /array-find@1.0.0: + resolution: {integrity: sha512-kO/vVCacW9mnpn3WPWbTVlEnOabK2L7LWi2HViURtCM46y1zb6I8UMjx4LgbiqadTgHnLInUronwn3ampNTJtQ==} + dev: true + + /array-flatten@1.1.1: + resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} + dev: true + + /array-flatten@2.1.2: + resolution: {integrity: sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==} + dev: true + + /array-includes@3.1.7: + resolution: {integrity: sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + get-intrinsic: 1.2.2 + is-string: 1.0.7 + dev: true + + /array-union@1.0.2: + resolution: {integrity: sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==} + engines: {node: '>=0.10.0'} + dependencies: + array-uniq: 1.0.3 + dev: true + + /array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + + /array-uniq@1.0.3: + resolution: {integrity: sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==} + engines: {node: '>=0.10.0'} + dev: true + + /array-unique@0.2.1: + resolution: {integrity: sha512-G2n5bG5fSUCpnsXz4+8FUkYsGPkNfLn9YvS66U5qbTIXI2Ynnlo4Bi42bWv+omKUCqz+ejzfClwne0alJWJPhg==} + engines: {node: '>=0.10.0'} + dev: true + + /array-unique@0.3.2: + resolution: {integrity: sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==} + engines: {node: '>=0.10.0'} + + /array.prototype.filter@1.0.3: + resolution: {integrity: sha512-VizNcj/RGJiUyQBgzwxzE5oHdeuXY5hSbbmKMlphj1cy1Vl7Pn2asCGbSrru6hSQjmCzqTBPVWAF/whmEOVHbw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + es-array-method-boxes-properly: 1.0.0 + is-string: 1.0.7 + dev: true + + /array.prototype.find@2.2.2: + resolution: {integrity: sha512-DRumkfW97iZGOfn+lIXbkVrXL04sfYKX+EfOodo8XboR5sxPDVvOjZTF/rysusa9lmhmSOeD6Vp6RKQP+eP4Tg==} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + es-shim-unscopables: 1.0.2 + dev: true + + /array.prototype.flat@1.3.2: + resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + es-shim-unscopables: 1.0.2 + dev: true + + /array.prototype.flatmap@1.3.2: + resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + es-shim-unscopables: 1.0.2 + dev: true + + /array.prototype.reduce@1.0.6: + resolution: {integrity: sha512-UW+Mz8LG/sPSU8jRDCjVr6J/ZKAGpHfwrZ6kWTG5qCxIEiXdVshqGnu5vEZA8S1y6X4aCSbQZ0/EEsfvEvBiSg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + es-array-method-boxes-properly: 1.0.0 + is-string: 1.0.7 + dev: true + + /arraybuffer-loader@1.0.8: + resolution: {integrity: sha512-CwUVCcxCgcgZUu2w741OV6Xj1tvRVQebq22RCyGXiLgJOJ4e4M/59EPYdtK2MLfIN28t1TDvuh2ojstNq3Kh5g==} + engines: {node: '>= 4.0.0'} + dependencies: + loader-utils: 1.4.2 + dev: false + + /arraybuffer.prototype.slice@1.0.2: + resolution: {integrity: sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==} + engines: {node: '>= 0.4'} + dependencies: + array-buffer-byte-length: 1.0.0 + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + get-intrinsic: 1.2.2 + is-array-buffer: 3.0.2 + is-shared-array-buffer: 1.0.2 + dev: true + + /arrify@1.0.1: + resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} + engines: {node: '>=0.10.0'} + dev: true + + /asap@2.0.6: + resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} + dev: true + + /asn1.js@5.4.1: + resolution: {integrity: sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==} + dependencies: + bn.js: 4.12.0 + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + safer-buffer: 2.1.2 + + /asn1@0.2.6: + resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==} + dependencies: + safer-buffer: 2.1.2 + + /assert-plus@1.0.0: + resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==} + engines: {node: '>=0.8'} + + /assert@1.5.1: + resolution: {integrity: sha512-zzw1uCAgLbsKwBfFc8CX78DDg+xZeBksSO3vwVIDDN5i94eOrPsSSyiVhmsSABFDM/OcpE2aagCat9dnWQLG1A==} + dependencies: + object.assign: 4.1.5 + util: 0.10.4 + + /assign-symbols@1.0.0: + resolution: {integrity: sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==} + engines: {node: '>=0.10.0'} + + /astral-regex@1.0.0: + resolution: {integrity: sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==} + engines: {node: '>=4'} + dev: true + + /async-each@1.0.6: + resolution: {integrity: sha512-c646jH1avxr+aVpndVMeAfYw7wAa6idufrlN3LPA4PmKS0QEGp6PIC9nwz0WQkkvBGAMEki3pFdtxaF39J9vvg==} + + /async-limiter@1.0.1: + resolution: {integrity: sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==} + dev: true + + /async@2.6.1: + resolution: {integrity: sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==} + dependencies: + lodash: 4.17.21 + dev: true + + /async@2.6.4: + resolution: {integrity: sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==} + dependencies: + lodash: 4.17.21 + dev: true + + /asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + /atob@2.1.2: + resolution: {integrity: sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==} + engines: {node: '>= 4.5.0'} + hasBin: true + + /audio-context@1.0.1: + resolution: {integrity: sha512-b7ZmHGyjcAI3KmshPa4YSPxPbjglZQtKfZtzqhUfE3VeoANTsNffywkmujI32Sj31Aku/aB9s3BW4r3nmTF88g==} + deprecated: Depends on Web-Audio-API implementation. Use either web-audio-api, web-audio-js or web-audio-engine package. + dependencies: + global: 4.4.0 + dev: false + + /automation-events@6.0.13: + resolution: {integrity: sha512-V1D19taPDEB7LUph6FpJv9m2i+UpLR096sAbPKt92sRChCOA6Jt2bcofU/YAwG8F8/qZp3GrrscJ1FzaEHd68w==} + engines: {node: '>=16.1.0'} + dependencies: + '@babel/runtime': 7.23.7 + tslib: 2.6.2 + dev: false + + /autoprefixer@9.8.8: + resolution: {integrity: sha512-eM9d/swFopRt5gdJ7jrpCwgvEMIayITpojhkkSMRsFHYuH5bkSQ4p/9qTEHtmNudUZh22Tehu7I6CxAW0IXTKA==} + hasBin: true + dependencies: + browserslist: 4.22.2 + caniuse-lite: 1.0.30001574 + normalize-range: 0.1.2 + num2fraction: 1.2.2 + picocolors: 0.2.1 + postcss: 7.0.39 + postcss-value-parser: 4.2.0 + dev: false + + /available-typed-arrays@1.0.5: + resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} + engines: {node: '>= 0.4'} + dev: true + + /aws-sign2@0.7.0: + resolution: {integrity: sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==} + + /aws4@1.12.0: + resolution: {integrity: sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==} + + /axios@0.27.2: + resolution: {integrity: sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==} + dependencies: + follow-redirects: 1.15.4(debug@4.3.4) + form-data: 4.0.0 + transitivePeerDependencies: + - debug + dev: true + + /babel-code-frame@6.26.0: + resolution: {integrity: sha512-XqYMR2dfdGMW+hd0IUZ2PwK+fGeFkOxZJ0wY+JaQAHzt1Zx8LcvpiZD2NiGkEG8qx0CfkAOr5xt76d1e8vG90g==} + dependencies: + chalk: 1.1.3 + esutils: 2.0.3 + js-tokens: 3.0.2 + + /babel-core@6.26.3: + resolution: {integrity: sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==} + dependencies: + babel-code-frame: 6.26.0 + babel-generator: 6.26.1 + 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.9.0 + debug: 2.6.9(supports-color@6.1.0) + json5: 0.5.1 + lodash: 4.17.21 + minimatch: 3.1.2 + path-is-absolute: 1.0.1 + private: 0.1.8 + slash: 1.0.0 + source-map: 0.5.7 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-core@7.0.0-bridge.0(@babel/core@7.14.8): + resolution: {integrity: sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.14.8 + dev: true + + /babel-eslint@10.0.3(eslint@5.16.0): + resolution: {integrity: sha512-z3U7eMY6r/3f3/JB9mTsLjyxrv0Yb1zb8PCWCLpguxfCzBIZUwy23R1t/XKewP+8mEN2Ck8Dtr4q20z6ce6SoA==} + engines: {node: '>=6'} + deprecated: babel-eslint is now @babel/eslint-parser. This package will no longer receive updates. + peerDependencies: + eslint: '>= 4.12.1' + dependencies: + '@babel/code-frame': 7.23.5 + '@babel/parser': 7.23.6 + '@babel/traverse': 7.23.7 + '@babel/types': 7.23.6 + eslint: 5.16.0 + eslint-visitor-keys: 1.3.0 + resolve: 1.22.8 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-generator@6.26.1: + resolution: {integrity: sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==} + 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.21 + source-map: 0.5.7 + trim-right: 1.0.1 + dev: true + + /babel-helpers@6.24.1: + resolution: {integrity: sha512-n7pFrqQm44TCYvrCDb0MqabAF+JUBq+ijBvNMUxpkLjJaAu32faIexewMumrH5KLLJ1HDyT0PTEqRyAe/GwwuQ==} + dependencies: + babel-runtime: 6.26.0 + babel-template: 6.26.0 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-jest@21.2.0(babel-core@6.26.3): + resolution: {integrity: sha512-O0W2qLoWu1QOoOGgxiR2JID4O6WSpxPiQanrkyi9SSlM0PJ60Ptzlck47lhtnr9YZO3zYOsxHwnyeWJ6AffoBQ==} + peerDependencies: + babel-core: ^6.0.0 || ^7.0.0-alpha || ^7.0.0-beta || ^7.0.0 + dependencies: + babel-core: 6.26.3 + babel-plugin-istanbul: 4.1.6 + babel-preset-jest: 21.2.0 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-loader@8.2.2(@babel/core@7.14.8)(webpack@4.46.0): + resolution: {integrity: sha512-JvTd0/D889PQBtUXJ2PXaKU/pjZDMtHA9V2ecm+eNRmmBCMR09a+fmpGTNwnJtFmFl5Ei7Vy47LjBb+L0wQ99g==} + engines: {node: '>= 8.9'} + peerDependencies: + '@babel/core': ^7.0.0 + webpack: '>=2' + dependencies: + '@babel/core': 7.14.8 + find-cache-dir: 3.3.2 + loader-utils: 1.4.2 + make-dir: 3.1.0 + schema-utils: 2.7.1 + webpack: 4.46.0(webpack-cli@3.3.12) + dev: true + + /babel-messages@6.23.0: + resolution: {integrity: sha512-Bl3ZiA+LjqaMtNYopA9TYE9HP1tQ+E5dLxE0XrAzcIJeK2UqF0/EaqXwBn9esd4UmTfEab+P+UYQ1GnioFIb/w==} + dependencies: + babel-runtime: 6.26.0 + dev: true + + /babel-plugin-istanbul@4.1.6: + resolution: {integrity: sha512-PWP9FQ1AhZhS01T/4qLSKoHGY/xvkZdVBGlKM/HuxxS3+sC66HhTNR7+MpbO/so/cz/wY94MeSWJuP1hXIPfwQ==} + dependencies: + babel-plugin-syntax-object-rest-spread: 6.13.0 + find-up: 2.1.0 + istanbul-lib-instrument: 1.10.2 + test-exclude: 4.2.3 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-plugin-jest-hoist@21.2.0: + resolution: {integrity: sha512-yi5QuiVyyvhBUDLP4ButAnhYzkdrUwWDtvUJv71hjH3fclhnZg4HkDeqaitcR2dZZx/E67kGkRcPVjtVu+SJfQ==} + dev: true + + /babel-plugin-polyfill-corejs2@0.2.3(@babel/core@7.14.8): + resolution: {integrity: sha512-NDZ0auNRzmAfE1oDDPW2JhzIMXUk+FFe2ICejmt5T4ocKgiQx3e0VCRx9NCAidcMtL2RUZaWtXnmjTCkx0tcbA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': 7.23.5 + '@babel/core': 7.14.8 + '@babel/helper-define-polyfill-provider': 0.2.4(@babel/core@7.14.8) + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-plugin-polyfill-corejs3@0.2.5(@babel/core@7.14.8): + resolution: {integrity: sha512-ninF5MQNwAX9Z7c9ED+H2pGt1mXdP4TqzlHKyPIYmJIYz0N+++uwdM7RnJukklhzJ54Q84vA4ZJkgs7lu5vqcw==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.14.8 + '@babel/helper-define-polyfill-provider': 0.2.4(@babel/core@7.14.8) + core-js-compat: 3.35.0 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-plugin-polyfill-regenerator@0.2.3(@babel/core@7.14.8): + resolution: {integrity: sha512-JVE78oRZPKFIeUqFGrSORNzQnrDwZR16oiWeGM8ZyjBn2XAT5OjP+wXx5ESuo33nUsFUEJYjtklnsKbxW5L+7g==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.14.8 + '@babel/helper-define-polyfill-provider': 0.2.4(@babel/core@7.14.8) + transitivePeerDependencies: + - supports-color + dev: true + + /babel-plugin-react-intl@3.5.1: + resolution: {integrity: sha512-1jlEJCSmLaJM4tjIKpu64UZ833COCHmwR77bFJDOye+zlwf80uR1b8p41l4tClx1QsrfI+qV6w/5AiPYQgaMUQ==} + deprecated: this package has been renamed to babel-plugin-formatjs + dependencies: + '@babel/core': 7.14.8 + '@babel/helper-plugin-utils': 7.22.5 + '@types/babel__core': 7.20.5 + fs-extra: 8.1.0 + intl-messageformat-parser: 1.8.1 + transitivePeerDependencies: + - supports-color + dev: false + + /babel-plugin-syntax-object-rest-spread@6.13.0: + resolution: {integrity: sha512-C4Aq+GaAj83pRQ0EFgTvw5YO6T3Qz2KGrNRwIj9mSoNHVvdZY4KO2uA6HNtNXCw993iSZnckY1aLW8nOi8i4+w==} + dev: true + + /babel-preset-jest@21.2.0: + resolution: {integrity: sha512-hm9cBnr2h3J7yXoTtAVV0zg+3vg0Q/gT2GYuzlreTU0EPkJRtlNgKJJ3tBKEn0+VjAi3JykV6xCJkuUYttEEfA==} + dependencies: + babel-plugin-jest-hoist: 21.2.0 + babel-plugin-syntax-object-rest-spread: 6.13.0 + dev: true + + /babel-register@6.26.0: + resolution: {integrity: sha512-veliHlHX06wjaeY8xNITbveXSiI+ASFnOqvne/LaIJIqOWi2Ogmj91KOugEz/hoh/fwMhXNBJPCv8Xaz5CyM4A==} + dependencies: + babel-core: 6.26.3 + babel-runtime: 6.26.0 + core-js: 2.5.7 + home-or-tmp: 2.0.0 + lodash: 4.17.21 + mkdirp: 0.5.6 + source-map-support: 0.4.18 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-runtime@6.26.0: + resolution: {integrity: sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==} + dependencies: + core-js: 2.5.7 + regenerator-runtime: 0.11.1 + + /babel-template@6.26.0: + resolution: {integrity: sha512-PCOcLFW7/eazGUKIoqH97sO9A2UYMahsn/yRQ7uOk37iutwjq7ODtcTNF+iFDSHNfkctqsLRjLP7URnOx0T1fg==} + dependencies: + babel-runtime: 6.26.0 + babel-traverse: 6.26.0 + babel-types: 6.26.0 + babylon: 6.18.0 + lodash: 4.17.21 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-traverse@6.26.0: + resolution: {integrity: sha512-iSxeXx7apsjCHe9c7n8VtRXGzI2Bk1rBSOJgCCjfyXb6v1aCqE1KSEpq/8SXuVN8Ka/Rh1WDTF0MDzkvTA4MIA==} + 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.9(supports-color@6.1.0) + globals: 9.18.0 + invariant: 2.2.4 + lodash: 4.17.21 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-types@6.26.0: + resolution: {integrity: sha512-zhe3V/26rCWsEZK8kZN+HaQj5yQ1CilTObixFzKW1UWjqG7618Twz6YEsCnjfg5gBcJh02DrpCkS9h98ZqDY+g==} + dependencies: + babel-runtime: 6.26.0 + esutils: 2.0.3 + lodash: 4.17.21 + to-fast-properties: 1.0.3 + dev: true + + /babylon@6.18.0: + resolution: {integrity: sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==} + hasBin: true + dev: true + + /balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + /base64-js@0.0.8: + resolution: {integrity: sha512-3XSA2cR/h/73EzlXXdU6YNycmYI7+kicTxks4eJg2g39biHR84slg2+des+p7iHYhbRg/udIS4TD53WabcOUkw==} + engines: {node: '>= 0.4'} + dev: false + + /base64-js@1.2.1: + resolution: {integrity: sha512-dwVUVIXsBZXwTuwnXI9RK8sBmgq09NDHzyR9SAph9eqk76gKK2JSQmZARC2zRC81JC2QTtxD0ARU5qTS25gIGw==} + dev: false + + /base64-js@1.3.0: + resolution: {integrity: sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==} + dev: false + + /base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + /base64-loader@1.0.0: + resolution: {integrity: sha512-p32+F8dg+ANGx7s8QsZS74ZPHfIycmC2yZcoerzFgbersIYWitPbbF39G6SBx3gyvzyLH5nt1ooocxr0IHuWKA==} + dev: false + + /base@0.11.2: + resolution: {integrity: sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==} + engines: {node: '>=0.10.0'} + dependencies: + cache-base: 1.0.1 + class-utils: 0.3.6 + component-emitter: 1.3.1 + define-property: 1.0.0 + isobject: 3.0.1 + mixin-deep: 1.3.2 + pascalcase: 0.1.1 + + /batch@0.6.1: + resolution: {integrity: sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==} + dev: true + + /bcrypt-pbkdf@1.0.2: + resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==} + dependencies: + tweetnacl: 0.14.5 + + /big.js@5.2.2: + resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} + + /binary-extensions@1.13.1: + resolution: {integrity: sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==} + engines: {node: '>=0.10.0'} + requiresBuild: true + + /binary-extensions@2.2.0: + resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + engines: {node: '>=8'} + requiresBuild: true + optional: true + + /bindings@1.5.0: + resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} + requiresBuild: true + dependencies: + file-uri-to-path: 1.0.0 + optional: true + + /bl@1.2.3: + resolution: {integrity: sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==} + dependencies: + readable-stream: 2.3.8 + safe-buffer: 5.2.1 + dev: false + + /bluebird@3.7.2: + resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} + + /bn.js@4.12.0: + resolution: {integrity: sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==} + + /bn.js@5.2.1: + resolution: {integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==} + + /body-parser@1.20.1(supports-color@6.1.0): + resolution: {integrity: sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 2.6.9(supports-color@6.1.0) + 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 + transitivePeerDependencies: + - supports-color + dev: true + + /bonjour@3.5.0: + resolution: {integrity: sha512-RaVTblr+OnEli0r/ud8InrU7D+G0y6aJhlxaLa6Pwty4+xoxboF1BsUI45tujvRpbj9dQVoglChqonGAsjEBYg==} + dependencies: + array-flatten: 2.1.2 + deep-equal: 1.1.2 + dns-equal: 1.0.0 + dns-txt: 2.0.2 + multicast-dns: 6.2.3 + multicast-dns-service-types: 1.1.0 + dev: true + + /boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + dev: true + + /bowser@1.9.4: + resolution: {integrity: sha512-9IdMmj2KjigRq6oWhmwv1W36pDuA4STQZ8q6YO9um+x07xgYNCD3Oou+WP/3L1HNz7iqythGet3/p4wvc8AAwQ==} + dev: false + + /brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + /braces@1.8.5: + resolution: {integrity: sha512-xU7bpz2ytJl1bH9cgIurjpg/n8Gohy9GTw81heDYLJQ4RU60dlyJsa+atVF2pI0yMMvKxI9HkKwjePCj5XI1hw==} + engines: {node: '>=0.10.0'} + dependencies: + expand-range: 1.8.2 + preserve: 0.2.0 + repeat-element: 1.1.4 + dev: true + + /braces@2.3.2(supports-color@6.1.0): + resolution: {integrity: sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==} + engines: {node: '>=0.10.0'} + 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.4 + snapdragon: 0.8.2(supports-color@6.1.0) + snapdragon-node: 2.1.1 + split-string: 3.1.0 + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + + /braces@3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.0.1 + + /brfs@1.6.1: + resolution: {integrity: sha512-OfZpABRQQf+Xsmju8XE9bDjs+uU4vLREGolP7bDgcpsI17QREyZ4Bl+2KLxxx1kCgA0fAIhKQBaBYh+PEcCqYQ==} + hasBin: true + dependencies: + quote-stream: 1.0.2 + resolve: 1.22.8 + static-module: 2.2.5 + through2: 2.0.5 + dev: false + + /brorand@1.1.0: + resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==} + + /browser-resolve@1.11.3: + resolution: {integrity: sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==} + dependencies: + resolve: 1.1.7 + dev: true + + /browser-stdout@1.3.0: + resolution: {integrity: sha512-7Rfk377tpSM9TWBEeHs0FlDZGoAIei2V/4MdZJoFMBFAK6BqLpxAIUepGRHGdPFgGsLb02PXovC4qddyHvQqTg==} + dev: false + + /browserify-aes@1.2.0: + resolution: {integrity: sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==} + dependencies: + buffer-xor: 1.0.3 + cipher-base: 1.0.4 + create-hash: 1.2.0 + evp_bytestokey: 1.0.3 + inherits: 2.0.4 + safe-buffer: 5.2.1 + + /browserify-cipher@1.0.1: + resolution: {integrity: sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==} + dependencies: + browserify-aes: 1.2.0 + browserify-des: 1.0.2 + evp_bytestokey: 1.0.3 + + /browserify-des@1.0.2: + resolution: {integrity: sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==} + dependencies: + cipher-base: 1.0.4 + des.js: 1.1.0 + inherits: 2.0.4 + safe-buffer: 5.2.1 + + /browserify-rsa@4.1.0: + resolution: {integrity: sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==} + dependencies: + bn.js: 5.2.1 + randombytes: 2.1.0 + + /browserify-sign@4.2.2: + resolution: {integrity: sha512-1rudGyeYY42Dk6texmv7c4VcQ0EsvVbLwZkA+AQB7SxvXxmcD93jcHie8bzecJ+ChDlmAm2Qyu0+Ccg5uhZXCg==} + engines: {node: '>= 4'} + dependencies: + bn.js: 5.2.1 + browserify-rsa: 4.1.0 + create-hash: 1.2.0 + create-hmac: 1.1.7 + elliptic: 6.5.4 + inherits: 2.0.4 + parse-asn1: 5.1.6 + readable-stream: 3.6.2 + safe-buffer: 5.2.1 + + /browserify-zlib@0.2.0: + resolution: {integrity: sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==} + dependencies: + pako: 1.0.11 + + /browserslist@4.22.2: + resolution: {integrity: sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + dependencies: + caniuse-lite: 1.0.30001574 + electron-to-chromium: 1.4.620 + node-releases: 2.0.14 + update-browserslist-db: 1.0.13(browserslist@4.22.2) + + /bser@2.1.1: + resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} + dependencies: + node-int64: 0.4.0 + dev: true + + /btoa@1.2.1: + resolution: {integrity: sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g==} + engines: {node: '>= 0.4.0'} + hasBin: true + dev: false + + /buffer-alloc-unsafe@1.1.0: + resolution: {integrity: sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==} + dev: false + + /buffer-alloc@1.2.0: + resolution: {integrity: sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==} + dependencies: + buffer-alloc-unsafe: 1.1.0 + buffer-fill: 1.0.0 + dev: false + + /buffer-crc32@0.2.13: + resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} + + /buffer-equal@0.0.1: + resolution: {integrity: sha512-RgSV6InVQ9ODPdLWJ5UAqBqJBOg370Nz6ZQtRzpt6nUjc8v0St97uJ4PYC6NztqIScrAXafKM3mZPMygSe1ggA==} + engines: {node: '>=0.4.0'} + dev: false + + /buffer-fill@1.0.0: + resolution: {integrity: sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==} + dev: false + + /buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + /buffer-indexof@1.1.1: + resolution: {integrity: sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==} + dev: true + + /buffer-xor@1.0.3: + resolution: {integrity: sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==} + + /buffer@4.9.2: + resolution: {integrity: sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + isarray: 1.0.0 + + /buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + dev: false + + /builtin-modules@1.1.1: + resolution: {integrity: sha512-wxXCdllwGhI2kCC0MnvTGYTMvnVZTvqgypkiTI8Pa5tcz2i6VqsqwYGgqwXji+4RgCzms6EajE4IxiUH6HH8nQ==} + engines: {node: '>=0.10.0'} + dev: true + + /builtin-status-codes@3.0.0: + resolution: {integrity: sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==} + + /bytes@3.0.0: + resolution: {integrity: sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==} + engines: {node: '>= 0.8'} + dev: true + + /bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + dev: true + + /cacache@10.0.4: + resolution: {integrity: sha512-Dph0MzuH+rTQzGPNT9fAnrPmMmjKfST6trxJeK7NQuHRaVw24VzPRWTmg9MpcwOVQZO0E1FBICUlFeNaKPIfHA==} + dependencies: + bluebird: 3.7.2 + chownr: 1.1.4 + glob: 7.2.3 + graceful-fs: 4.2.11 + lru-cache: 4.1.5 + mississippi: 2.0.0 + mkdirp: 0.5.6 + move-concurrently: 1.0.1 + promise-inflight: 1.0.1(bluebird@3.7.2) + rimraf: 2.7.1 + ssri: 5.3.0 + unique-filename: 1.1.1 + y18n: 4.0.3 + dev: true + + /cacache@12.0.4: + resolution: {integrity: sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==} + dependencies: + bluebird: 3.7.2 + chownr: 1.1.4 + figgy-pudding: 3.5.2 + glob: 7.2.3 + graceful-fs: 4.2.11 + infer-owner: 1.0.4 + lru-cache: 5.1.1 + mississippi: 3.0.0 + mkdirp: 0.5.6 + move-concurrently: 1.0.1 + promise-inflight: 1.0.1(bluebird@3.7.2) + rimraf: 2.7.1 + ssri: 6.0.2 + unique-filename: 1.1.1 + y18n: 4.0.3 + + /cacache@15.3.0: + resolution: {integrity: sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==} + engines: {node: '>= 10'} + dependencies: + '@npmcli/fs': 1.1.1 + '@npmcli/move-file': 1.1.2 + chownr: 2.0.0 + fs-minipass: 2.1.0 + glob: 7.2.3 + infer-owner: 1.0.4 + lru-cache: 6.0.0 + minipass: 3.3.6 + minipass-collect: 1.0.2 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + mkdirp: 1.0.3 + p-map: 4.0.0 + promise-inflight: 1.0.1(bluebird@3.7.2) + rimraf: 3.0.2 + ssri: 8.0.1 + tar: 6.2.0 + unique-filename: 1.1.1 + transitivePeerDependencies: + - bluebird + dev: false + + /cache-base@1.0.1: + resolution: {integrity: sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==} + engines: {node: '>=0.10.0'} + dependencies: + collection-visit: 1.0.0 + component-emitter: 1.3.1 + get-value: 2.0.6 + has-value: 1.0.0 + isobject: 3.0.1 + set-value: 2.0.1 + to-object-path: 0.3.0 + union-value: 1.0.1 + unset-value: 1.0.0 + + /cacheable-request@2.1.4: + resolution: {integrity: sha512-vag0O2LKZ/najSoUwDbVlnlCFvhBE/7mGTY2B5FgCBDcRD+oVV1HYTOwM6JZfMg/hIcM6IwnTZ1uQQL5/X3xIQ==} + dependencies: + clone-response: 1.0.2 + get-stream: 3.0.0 + http-cache-semantics: 3.8.1 + keyv: 3.0.0 + lowercase-keys: 1.0.0 + normalize-url: 2.0.1 + responselike: 1.0.2 + dev: false + + /call-bind@1.0.5: + resolution: {integrity: sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==} + dependencies: + function-bind: 1.1.2 + get-intrinsic: 1.2.2 + set-function-length: 1.1.1 + + /caller-callsite@2.0.0: + resolution: {integrity: sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ==} + engines: {node: '>=4'} + dependencies: + callsites: 2.0.0 + dev: false + + /caller-path@2.0.0: + resolution: {integrity: sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A==} + engines: {node: '>=4'} + dependencies: + caller-callsite: 2.0.0 + dev: false + + /callsites@2.0.0: + resolution: {integrity: sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ==} + engines: {node: '>=4'} + + /callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + dev: true + + /camel-case@4.1.2: + resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} + dependencies: + pascal-case: 3.1.2 + tslib: 2.6.2 + dev: true + + /camelcase@2.1.1: + resolution: {integrity: sha512-DLIsRzJVBQu72meAKPkWQOLcujdXT32hwdfnkI1frSiSRMK1MofjKHf+MEx0SB6fjEFXL8fBDv1dKymBlOp4Qw==} + engines: {node: '>=0.10.0'} + dev: false + + /camelcase@4.1.0: + resolution: {integrity: sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw==} + engines: {node: '>=4'} + dev: true + + /camelcase@5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + + /caniuse-lite@1.0.30001574: + resolution: {integrity: sha512-BtYEK4r/iHt/txm81KBudCUcTy7t+s9emrIaHqjYurQ10x71zJ5VQ9x1dYPcz/b+pKSp4y/v1xSI67A+LzpNyg==} + + /cannon-es@0.20.0: + resolution: {integrity: sha512-eZhWTZIkFOnMAJOgfXJa9+b3kVlvG+FX4mdkpePev/w/rP5V8NRquGyEozcjPfEoXUlb+p7d9SUcmDSn14prOA==} + dev: false + + /canvas-toBlob@1.0.0: + resolution: {integrity: sha512-oU5bawygt/Nef9F+C49eTFmzXzz6yKdGqn6J1wn/LZQF5ulnnZVm0KIZzik85I6tjCbZFH6aa47j4bU2tkHxRw==} + dev: false + + /capture-exit@1.2.0: + resolution: {integrity: sha512-IS4lTgp57lUcpXzyCaiUQcRZBxZAkzl+jNXrMUXZjdnr2yujpKUMG9OYeYL29i6fL66ihypvVJ/MeX0B+9pWOg==} + dependencies: + rsvp: 3.6.2 + dev: true + + /caseless@0.12.0: + resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} + + /chalk@1.1.3: + resolution: {integrity: sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==} + engines: {node: '>=0.10.0'} + dependencies: + ansi-styles: 2.2.1 + escape-string-regexp: 1.0.5 + has-ansi: 2.0.0 + strip-ansi: 3.0.1 + supports-color: 2.0.0 + + /chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + + /chardet@0.7.0: + resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} + dev: true + + /cheerio-select@2.1.0: + resolution: {integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==} + 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.1.0 + dev: true + + /cheerio@1.0.0-rc.12: + resolution: {integrity: sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==} + engines: {node: '>= 6'} + dependencies: + cheerio-select: 2.1.0 + dom-serializer: 2.0.0 + domhandler: 5.0.3 + domutils: 3.1.0 + htmlparser2: 8.0.2 + parse5: 7.1.2 + parse5-htmlparser2-tree-adapter: 7.0.0 + dev: true + + /chokidar@2.1.8(supports-color@6.1.0): + resolution: {integrity: sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==} + deprecated: Chokidar 2 does not receive security updates since 2019. Upgrade to chokidar 3 with 15x fewer dependencies + dependencies: + anymatch: 2.0.0(supports-color@6.1.0) + async-each: 1.0.6 + braces: 2.3.2(supports-color@6.1.0) + glob-parent: 3.1.0 + inherits: 2.0.4 + is-binary-path: 1.0.1 + is-glob: 4.0.3 + normalize-path: 3.0.0 + path-is-absolute: 1.0.1 + readdirp: 2.2.1(supports-color@6.1.0) + upath: 1.2.0 + optionalDependencies: + fsevents: 1.2.13 + transitivePeerDependencies: + - supports-color + + /chokidar@3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + engines: {node: '>= 8.10.0'} + requiresBuild: true + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + optional: true + + /chownr@1.1.4: + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + + /chownr@2.0.0: + resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} + engines: {node: '>=10'} + dev: false + + /chrome-trace-event@1.0.3: + resolution: {integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==} + engines: {node: '>=6.0'} + + /chromedriver@105.0.0: + resolution: {integrity: sha512-BX3GOUW5m6eiW9cVVF8hw+EFxvrGqYCxbwOqnpk8PjbNFqL5xjy7yel+e6ilJPjckAYFutMKs8XJvOs/W85vvg==} + engines: {node: '>=10'} + hasBin: true + requiresBuild: true + dependencies: + '@testim/chrome-version': 1.1.4 + axios: 0.27.2 + del: 6.1.1 + extract-zip: 2.0.1 + https-proxy-agent: 5.0.1 + proxy-from-env: 1.1.0 + tcp-port-used: 1.0.2 + transitivePeerDependencies: + - debug + - supports-color + dev: true + + /ci-info@1.6.0: + resolution: {integrity: sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==} + dev: true + + /cipher-base@1.0.4: + resolution: {integrity: sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==} + dependencies: + inherits: 2.0.4 + safe-buffer: 5.2.1 + + /class-utils@0.3.6: + resolution: {integrity: sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==} + engines: {node: '>=0.10.0'} + dependencies: + arr-union: 3.1.0 + define-property: 0.2.5 + isobject: 3.0.1 + static-extend: 0.1.2 + + /classnames@2.2.5: + resolution: {integrity: sha512-DTt3GhOUDKhh4ONwIJW4lmhyotQmV2LjNlGK/J2hkwUcqcbKkCLAdJPtxQnxnlc7SR3f1CEXCyMmc7WLUsWbNA==} + dev: false + + /classnames@2.2.6: + resolution: {integrity: sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q==} + dev: false + + /clean-css@4.2.4: + resolution: {integrity: sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A==} + engines: {node: '>= 4.0'} + dependencies: + source-map: 0.6.1 + dev: true + + /clean-stack@2.2.0: + resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} + engines: {node: '>=6'} + + /cli-cursor@2.1.0: + resolution: {integrity: sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==} + engines: {node: '>=4'} + dependencies: + restore-cursor: 2.0.0 + dev: true + + /cli-width@1.1.1: + resolution: {integrity: sha512-eMU2akIeEIkCxGXUNmDnJq1KzOIiPnJ+rKqRe6hcxE3vIOPvpMrBYOn/Bl7zNlYJj/zQxXquAnozHUCf9Whnsg==} + dev: false + + /cli-width@2.2.1: + resolution: {integrity: sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==} + dev: true + + /cliui@3.2.0: + resolution: {integrity: sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w==} + dependencies: + string-width: 1.0.2 + strip-ansi: 3.0.1 + wrap-ansi: 2.1.0 + + /cliui@5.0.0: + resolution: {integrity: sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==} + dependencies: + string-width: 3.1.0 + strip-ansi: 5.2.0 + wrap-ansi: 5.1.0 + + /clone-response@1.0.2: + resolution: {integrity: sha512-yjLXh88P599UOyPTFX0POsd7WxnbsVsGohcwzHOLspIhhpalPw1BcqED8NblyZLKcGrL8dTgMlcaZxV2jAD41Q==} + dependencies: + mimic-response: 1.0.1 + dev: false + + /code-point-at@1.1.0: + resolution: {integrity: sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==} + engines: {node: '>=0.10.0'} + + /collection-visit@1.0.0: + resolution: {integrity: sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==} + engines: {node: '>=0.10.0'} + dependencies: + map-visit: 1.0.0 + object-visit: 1.0.1 + + /color-convert@0.5.3: + resolution: {integrity: sha512-RwBeO/B/vZR3dfKL1ye/vx8MHZ40ugzpyfeVG5GsiuGnrlMWe2o8wxBbLCpw9CsxV+wHuzYlCiWnybrIA0ling==} + dev: false + + /color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + dependencies: + color-name: 1.1.3 + + /color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + + /colors@0.6.2: + resolution: {integrity: sha512-OsSVtHK8Ir8r3+Fxw/b4jS1ZLPXkV6ZxDRJQzeD7qo0SqMXWrHDM71DgYzPMHY8SFJ0Ao+nNU2p1MmwdzKqPrw==} + engines: {node: '>=0.1.90'} + dev: false + + /combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + dependencies: + delayed-stream: 1.0.0 + + /commander@2.1.0: + resolution: {integrity: sha512-J2wnb6TKniXNOtoHS8TSrG9IOQluPrsmyAJ8oCUJOBmv+uLBCyPYAZkD2jFvw2DCzIXNnISIM01NIvr35TkBMQ==} + engines: {node: '>= 0.6.x'} + dev: false + + /commander@2.11.0: + resolution: {integrity: sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==} + dev: false + + /commander@2.13.0: + resolution: {integrity: sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA==} + dev: true + + /commander@2.15.1: + resolution: {integrity: sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==} + dev: true + + /commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + + /commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + + /commondir@1.0.1: + resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} + + /complex.js@2.1.1: + resolution: {integrity: sha512-8njCHOTtFFLtegk6zQo0kkVX1rngygb/KQI6z1qZxlFI3scluC+LVTCFbrkWjBv4vvLlbQ9t88IPMC6k95VTTg==} + dev: false + + /component-emitter@1.3.1: + resolution: {integrity: sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==} + + /compressible@2.0.18: + resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} + engines: {node: '>= 0.6'} + dependencies: + mime-db: 1.52.0 + dev: true + + /compression@1.7.4(supports-color@6.1.0): + resolution: {integrity: sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==} + engines: {node: '>= 0.8.0'} + dependencies: + accepts: 1.3.8 + bytes: 3.0.0 + compressible: 2.0.18 + debug: 2.6.9(supports-color@6.1.0) + on-headers: 1.0.2 + safe-buffer: 5.1.2 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + dev: true + + /computed-style-to-inline-style@3.0.0: + resolution: {integrity: sha512-6XAOG2ZZkpCfbM9AhRN4/wjMgQujtH/2q/eowZON190oAASUjEb3jwcodjmRlR8HNDMahJdBQwchuDftOtF7eg==} + dev: false + + /concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + /concat-stream@1.6.2: + resolution: {integrity: sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==} + engines: {'0': node >= 0.8} + dependencies: + buffer-from: 1.1.2 + inherits: 2.0.4 + readable-stream: 2.3.8 + typedarray: 0.0.6 + + /connect-history-api-fallback@1.6.0: + resolution: {integrity: sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==} + engines: {node: '>=0.8'} + dev: true + + /console-browserify@1.2.0: + resolution: {integrity: sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==} + + /constants-browserify@1.0.0: + resolution: {integrity: sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==} + + /content-disposition@0.5.4: + resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} + engines: {node: '>= 0.6'} + dependencies: + safe-buffer: 5.2.1 + + /content-type-parser@1.0.2: + resolution: {integrity: sha512-lM4l4CnMEwOLHAHr/P6MEZwZFPJFtAAKgL6pogbXmVZggIqXhdB6RbBtPOTsw2FcXwYhehRGERJmRrjOiIB8pQ==} + dev: true + + /content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + dev: true + + /convert-source-map@1.9.0: + resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + + /cookie-signature@1.0.6: + resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} + dev: true + + /cookie@0.5.0: + resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} + engines: {node: '>= 0.6'} + dev: true + + /copy-concurrently@1.0.5: + resolution: {integrity: sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==} + dependencies: + aproba: 1.2.0 + fs-write-stream-atomic: 1.0.10 + iferr: 0.1.5 + mkdirp: 0.5.6 + rimraf: 2.7.1 + run-queue: 1.0.3 + + /copy-descriptor@0.1.1: + resolution: {integrity: sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==} + engines: {node: '>=0.10.0'} + + /copy-webpack-plugin@6.4.1(webpack@4.46.0): + resolution: {integrity: sha512-MXyPCjdPVx5iiWyl40Va3JGh27bKzOTNY3NjUTrosD2q7dR/cLD0013uqJ3BpFbUjyONINjb6qI7nDIJujrMbA==} + engines: {node: '>= 10.13.0'} + peerDependencies: + webpack: ^4.37.0 || ^5.0.0 + dependencies: + cacache: 15.3.0 + fast-glob: 3.3.2 + find-cache-dir: 3.3.2 + glob-parent: 5.1.2 + globby: 11.1.0 + loader-utils: 2.0.4 + normalize-path: 3.0.0 + p-limit: 3.1.0 + schema-utils: 3.3.0 + serialize-javascript: 5.0.1 + webpack: 4.46.0(webpack-cli@3.3.12) + webpack-sources: 1.4.3 + transitivePeerDependencies: + - bluebird + dev: false + + /core-js-compat@3.35.0: + resolution: {integrity: sha512-5blwFAddknKeNgsjBzilkdQ0+YK8L1PfqPYq40NOYMYFSS38qj+hpTcLLWwpIwA2A5bje/x5jmVn2tzUMg9IVw==} + dependencies: + browserslist: 4.22.2 + dev: true + + /core-js@1.2.7: + resolution: {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 + + /core-js@2.3.0: + resolution: {integrity: sha512-N41UFUZNqoTSGUSyL7kiStAkH31Hxq197A4Gp9MxTZfAd52pXod7VM7kWiRP0J0YpQDeaE4SLsb+2OGgtgvUEw==} + 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: false + + /core-js@2.5.7: + resolution: {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. + + /core-js@3.35.0: + resolution: {integrity: sha512-ntakECeqg81KqMueeGJ79Q5ZgQNR+6eaE8sxGCx62zMbAIj65q+uYvatToew3m6eAGdU4gNZwpZ34NMe4GYswg==} + requiresBuild: true + dev: false + + /core-util-is@1.0.2: + resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==} + + /core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + + /cosmiconfig@5.2.1: + resolution: {integrity: sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==} + engines: {node: '>=4'} + dependencies: + import-fresh: 2.0.0 + is-directory: 0.3.1 + js-yaml: 3.14.1 + parse-json: 4.0.0 + dev: false + + /create-ecdh@4.0.4: + resolution: {integrity: sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==} + dependencies: + bn.js: 4.12.0 + elliptic: 6.5.4 + + /create-hash@1.2.0: + resolution: {integrity: sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==} + dependencies: + cipher-base: 1.0.4 + inherits: 2.0.4 + md5.js: 1.3.5 + ripemd160: 2.0.2 + sha.js: 2.4.11 + + /create-hmac@1.1.7: + resolution: {integrity: sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==} + dependencies: + cipher-base: 1.0.4 + create-hash: 1.2.0 + inherits: 2.0.4 + ripemd160: 2.0.2 + safe-buffer: 5.2.1 + sha.js: 2.4.11 + + /cross-spawn@5.1.0: + resolution: {integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==} + dependencies: + lru-cache: 4.1.5 + shebang-command: 1.2.0 + which: 1.3.1 + dev: true + + /cross-spawn@6.0.5: + resolution: {integrity: sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==} + engines: {node: '>=4.8'} + dependencies: + nice-try: 1.0.5 + path-key: 2.0.1 + semver: 5.7.2 + shebang-command: 1.2.0 + which: 1.3.1 + + /crypto-browserify@3.12.0: + resolution: {integrity: sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==} + dependencies: + browserify-cipher: 1.0.1 + browserify-sign: 4.2.2 + create-ecdh: 4.0.4 + create-hash: 1.2.0 + create-hmac: 1.1.7 + diffie-hellman: 5.0.3 + inherits: 2.0.4 + pbkdf2: 3.1.2 + public-encrypt: 4.0.3 + randombytes: 2.1.0 + randomfill: 1.0.4 + + /css-loader@1.0.1(webpack@4.46.0): + resolution: {integrity: sha512-+ZHAZm/yqvJ2kDtPne3uX0C+Vr3Zn5jFn2N4HywtS5ujwvsVkyg0VArEXpl3BgczDA8anieki1FIzhchX4yrDw==} + engines: {node: '>= 6.9.0 <7.0.0 || >= 8.9.0'} + peerDependencies: + webpack: ^4.0.0 + dependencies: + babel-code-frame: 6.26.0 + css-selector-tokenizer: 0.7.3 + icss-utils: 2.1.0 + loader-utils: 1.4.2 + lodash: 4.17.21 + postcss: 6.0.23 + postcss-modules-extract-imports: 1.2.1 + 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.1 + source-list-map: 2.0.1 + webpack: 4.46.0(webpack-cli@3.3.12) + dev: false + + /css-mediaquery@0.1.2: + resolution: {integrity: sha512-COtn4EROW5dBGlE/4PiKnh6rZpAPxDeFLaEEwt4i10jpDMFt2EhQGS79QmmrO+iKCHv0PU/HrOWEhijFd1x99Q==} + dev: false + + /css-select@4.3.0: + resolution: {integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==} + dependencies: + boolbase: 1.0.0 + css-what: 6.1.0 + domhandler: 4.3.1 + domutils: 2.8.0 + nth-check: 2.1.1 + dev: true + + /css-select@5.1.0: + resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==} + dependencies: + boolbase: 1.0.0 + css-what: 6.1.0 + domhandler: 5.0.3 + domutils: 3.1.0 + nth-check: 2.1.1 + dev: true + + /css-selector-tokenizer@0.7.3: + resolution: {integrity: sha512-jWQv3oCEL5kMErj4wRnK/OPoBi0D+P1FR2cDCKYPaMeD2eW3/mttav8HT4hT1CKopiJI/psEULjkClhvJo4Lvg==} + dependencies: + cssesc: 3.0.0 + fastparse: 1.1.2 + dev: false + + /css-tree@1.1.3: + resolution: {integrity: sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==} + engines: {node: '>=8.0.0'} + dependencies: + mdn-data: 2.0.14 + source-map: 0.6.1 + dev: false + + /css-vendor@0.3.8: + resolution: {integrity: sha512-Vx/Vl3zsHj32Z+WTNzGjd2iSbSIJTYHMmyGUT2nzCjj0Xk4qLfwpQ8nF6TQ5oo3Cf0s/An3DTc7LclH1BkAXbQ==} + dependencies: + is-in-browser: 1.1.3 + dev: false + + /css-what@6.1.0: + resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} + engines: {node: '>= 6'} + dev: true + + /cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + dev: false + + /cssom@0.3.8: + resolution: {integrity: sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==} + dev: true + + /cssstyle@0.2.37: + resolution: {integrity: sha512-FUpKc+1FNBsHUr9IsfSGCovr8VuGOiiuzlgCyppKBjJi2jYTOFLN3oiiNRMIvYqbFzF38mqKj4BgcevzU5/kIA==} + dependencies: + cssom: 0.3.8 + dev: true + + /cyclist@1.0.2: + resolution: {integrity: sha512-0sVXIohTfLqVIW3kb/0n6IiWF3Ifj5nm2XaSrLq2DI6fKIGa2fYAZdk917rUneaeLVpYfFcyXE2ft0fe3remsA==} + + /dashdash@1.14.1: + resolution: {integrity: sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==} + engines: {node: '>=0.10'} + dependencies: + assert-plus: 1.0.0 + + /debug@2.6.9(supports-color@6.1.0): + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.0.0 + supports-color: 6.1.0 + + /debug@3.1.0(supports-color@4.4.0): + resolution: {integrity: sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.0.0 + supports-color: 4.4.0 + dev: false + + /debug@3.2.7(supports-color@6.1.0): + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.3 + supports-color: 6.1.0 + dev: true + + /debug@4.3.1: + resolution: {integrity: sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + dev: true + + /debug@4.3.4(supports-color@6.1.0): + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + supports-color: 6.1.0 + + /decamelize@1.2.0: + resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} + engines: {node: '>=0.10.0'} + + /decimal.js@10.4.3: + resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} + dev: false + + /decode-html@2.0.0: + resolution: {integrity: sha512-lVJ+EBozhAXA2nSQG+xAgcD0P5K3uejnIIvM09uoQfS8AALkQ+HhHcEUvKovXi0EIpIZWjm0y8X7ULjaJpgY9w==} + dev: false + + /decode-uri-component@0.2.2: + resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} + engines: {node: '>=0.10'} + + /decompress-response@3.3.0: + resolution: {integrity: sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==} + engines: {node: '>=4'} + dependencies: + mimic-response: 1.0.1 + dev: false + + /decompress-tar@4.1.1: + resolution: {integrity: sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==} + engines: {node: '>=4'} + dependencies: + file-type: 5.2.0 + is-stream: 1.1.0 + tar-stream: 1.6.2 + dev: false + + /decompress-tarbz2@4.1.1: + resolution: {integrity: sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==} + engines: {node: '>=4'} + dependencies: + decompress-tar: 4.1.1 + file-type: 6.2.0 + is-stream: 1.1.0 + seek-bzip: 1.0.6 + unbzip2-stream: 1.4.3 + dev: false + + /decompress-targz@4.1.1: + resolution: {integrity: sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==} + engines: {node: '>=4'} + dependencies: + decompress-tar: 4.1.1 + file-type: 5.2.0 + is-stream: 1.1.0 + dev: false + + /decompress-unzip@4.0.1: + resolution: {integrity: sha512-1fqeluvxgnn86MOh66u8FjbtJpAFv5wgCT9Iw8rcBqQcCo5tO8eiJw7NNTrvt9n4CRBVq7CstiS922oPgyGLrw==} + engines: {node: '>=4'} + dependencies: + file-type: 3.9.0 + get-stream: 2.3.1 + pify: 2.3.0 + yauzl: 2.10.0 + dev: false + + /decompress@4.2.1: + resolution: {integrity: sha512-e48kc2IjU+2Zw8cTb6VZcJQ3lgVbS4uuB1TfCHbiZIP/haNXm+SVyhu+87jts5/3ROpd82GSVCoNs/z8l4ZOaQ==} + engines: {node: '>=4'} + dependencies: + decompress-tar: 4.1.1 + decompress-tarbz2: 4.1.1 + decompress-targz: 4.1.1 + decompress-unzip: 4.0.1 + graceful-fs: 4.2.11 + make-dir: 1.3.0 + pify: 2.3.0 + strip-dirs: 2.1.0 + dev: false + + /deep-equal@1.1.2: + resolution: {integrity: sha512-5tdhKF6DbU7iIzrIOa1AOUt39ZRm13cmL1cGEh//aqR8x9+tNfbywRf0n5FD/18OKMdo7DNEtrX2t22ZAkI+eg==} + engines: {node: '>= 0.4'} + dependencies: + is-arguments: 1.1.1 + is-date-object: 1.0.5 + is-regex: 1.1.4 + object-is: 1.1.5 + object-keys: 1.1.1 + regexp.prototype.flags: 1.5.1 + dev: true + + /deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + /default-gateway@4.2.0: + resolution: {integrity: sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==} + engines: {node: '>=6'} + dependencies: + execa: 1.0.0 + ip-regex: 2.1.0 + dev: true + + /default-require-extensions@1.0.0: + resolution: {integrity: sha512-Dn2eAftOqXhNXs5f/Xjn7QTZ6kDYkx7u0EXQInN1oyYwsZysu11q7oTtaKcbzLxZRJiDHa8VmwpWmb4lY5FqgA==} + engines: {node: '>=0.10.0'} + dependencies: + strip-bom: 2.0.0 + dev: true + + /define-data-property@1.1.1: + resolution: {integrity: sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.2 + gopd: 1.0.1 + has-property-descriptors: 1.0.1 + + /define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.1 + has-property-descriptors: 1.0.1 + object-keys: 1.1.1 + + /define-property@0.2.5: + resolution: {integrity: sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==} + engines: {node: '>=0.10.0'} + dependencies: + is-descriptor: 0.1.7 + + /define-property@1.0.0: + resolution: {integrity: sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==} + engines: {node: '>=0.10.0'} + dependencies: + is-descriptor: 1.0.3 + + /define-property@2.0.2: + resolution: {integrity: sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==} + engines: {node: '>=0.10.0'} + dependencies: + is-descriptor: 1.0.3 + isobject: 3.0.1 + + /del@4.1.1: + resolution: {integrity: sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==} + engines: {node: '>=6'} + dependencies: + '@types/glob': 7.2.0 + globby: 6.1.0 + is-path-cwd: 2.2.0 + is-path-in-cwd: 2.1.0 + p-map: 2.1.0 + pify: 4.0.1 + rimraf: 2.7.1 + dev: true + + /del@6.1.1: + resolution: {integrity: sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==} + engines: {node: '>=10'} + dependencies: + globby: 11.1.0 + graceful-fs: 4.2.11 + is-glob: 4.0.3 + is-path-cwd: 2.2.0 + is-path-inside: 3.0.3 + p-map: 4.0.0 + rimraf: 3.0.2 + slash: 3.0.0 + dev: true + + /delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + /depd@1.1.2: + resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} + engines: {node: '>= 0.6'} + dev: true + + /depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + dev: true + + /des.js@1.1.0: + resolution: {integrity: sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==} + dependencies: + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + + /destroy@1.2.0: + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + dev: true + + /detect-file@1.0.0: + resolution: {integrity: sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==} + engines: {node: '>=0.10.0'} + + /detect-indent@4.0.0: + resolution: {integrity: sha512-BDKtmHlOzwI7iRuEkhzsnPoi5ypEhWAJB5RvHWe1kMr06js3uK5B3734i3ui5Yd+wOJV1cpE4JnivPD283GU/A==} + engines: {node: '>=0.10.0'} + dependencies: + repeating: 2.0.1 + dev: true + + /detect-node@2.1.0: + resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} + dev: true + + /diff-match-patch@1.0.4: + resolution: {integrity: sha512-Uv3SW8bmH9nAtHKaKSanOQmj2DnlH65fUpcrMdfdaOxUG02QQ4YGZ8AE7kKOMisF7UqvOlGKVYWRvezdncW9lg==} + dev: false + + /diff@3.3.1: + resolution: {integrity: sha512-MKPHZDMB0o6yHyDryUOScqZibp914ksXwAMYMTHj6KO8UeKsRYNJD3oNCKjTqZon+V488P7N/HzXF8t7ZR95ww==} + engines: {node: '>=0.3.1'} + dev: false + + /diff@3.5.0: + resolution: {integrity: sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==} + engines: {node: '>=0.3.1'} + dev: true + + /diffie-hellman@5.0.3: + resolution: {integrity: sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==} + dependencies: + bn.js: 4.12.0 + miller-rabin: 4.0.1 + randombytes: 2.1.0 + + /dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + dependencies: + path-type: 4.0.0 + + /discontinuous-range@1.0.0: + resolution: {integrity: sha512-c68LpLbO+7kP/b1Hr1qs8/BJ09F5khZGTxqxZuhzxpmwJKOgRFHJWIb9/KmqnqHhLdO55aOxFH/EGBvUQbL/RQ==} + dev: true + + /dns-equal@1.0.0: + resolution: {integrity: sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==} + dev: true + + /dns-packet@1.3.4: + resolution: {integrity: sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==} + dependencies: + ip: 1.1.8 + safe-buffer: 5.2.1 + dev: true + + /dns-txt@2.0.2: + resolution: {integrity: sha512-Ix5PrWjphuSoUXV/Zv5gaFHjnaJtb02F2+Si3Ht9dyJ87+Z/lMmy+dpNHtTGraNK958ndXq2i+GLkWsWHcKaBQ==} + dependencies: + buffer-indexof: 1.1.1 + dev: true + + /doctrine@2.1.0: + resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} + engines: {node: '>=0.10.0'} + dependencies: + esutils: 2.0.3 + dev: true + + /doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + dependencies: + esutils: 2.0.3 + dev: true + + /dom-converter@0.2.0: + resolution: {integrity: sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==} + dependencies: + utila: 0.4.0 + dev: true + + /dom-helpers@3.4.0: + resolution: {integrity: sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA==} + dependencies: + '@babel/runtime': 7.23.7 + dev: false + + /dom-serializer@0.2.2: + resolution: {integrity: sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==} + dependencies: + domelementtype: 2.3.0 + entities: 2.2.0 + dev: false + + /dom-serializer@1.4.1: + resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==} + dependencies: + domelementtype: 2.3.0 + domhandler: 4.3.1 + entities: 2.2.0 + dev: true + + /dom-serializer@2.0.0: + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + entities: 4.5.0 + dev: true + + /dom-walk@0.1.2: + resolution: {integrity: sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==} + dev: false + + /domain-browser@1.2.0: + resolution: {integrity: sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==} + engines: {node: '>=0.4', npm: '>=1.2'} + + /domelementtype@1.3.1: + resolution: {integrity: sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==} + dev: false + + /domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + + /domhandler@2.4.2: + resolution: {integrity: sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==} + dependencies: + domelementtype: 1.3.1 + dev: false + + /domhandler@4.3.1: + resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==} + engines: {node: '>= 4'} + dependencies: + domelementtype: 2.3.0 + dev: true + + /domhandler@5.0.3: + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} + engines: {node: '>= 4'} + dependencies: + domelementtype: 2.3.0 + dev: true + + /dompurify@2.2.7: + resolution: {integrity: sha512-jdtDffdGNY+C76jvodNTu9jt5yYj59vuTUyx+wXdzcSwAGTYZDAQkQ7Iwx9zcGrA4ixC1syU4H3RZROqRxokxg==} + dev: false + + /domutils@1.7.0: + resolution: {integrity: sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==} + dependencies: + dom-serializer: 0.2.2 + domelementtype: 1.3.1 + dev: false + + /domutils@2.8.0: + resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} + dependencies: + dom-serializer: 1.4.1 + domelementtype: 2.3.0 + domhandler: 4.3.1 + dev: true + + /domutils@3.1.0: + resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==} + dependencies: + dom-serializer: 2.0.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + dev: true + + /dot-case@3.0.4: + resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} + dependencies: + no-case: 3.0.4 + tslib: 2.6.2 + dev: true + + /download@8.0.0: + resolution: {integrity: sha512-ASRY5QhDk7FK+XrQtQyvhpDKanLluEEQtWl/J7Lxuf/b+i8RYh997QeXvL85xitrmRKVlx9c7eTrcRdq2GS4eA==} + engines: {node: '>=10'} + dependencies: + archive-type: 4.0.0 + content-disposition: 0.5.4 + decompress: 4.2.1 + ext-name: 5.0.0 + file-type: 11.1.0 + filenamify: 3.0.0 + get-stream: 4.1.0 + got: 8.3.2 + make-dir: 2.1.0 + p-event: 2.3.1 + pify: 4.0.1 + dev: false + + /duplexer2@0.1.4: + resolution: {integrity: sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==} + dependencies: + readable-stream: 2.3.8 + dev: false + + /duplexer3@0.1.5: + resolution: {integrity: sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==} + dev: false + + /duplexify@3.7.1: + resolution: {integrity: sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==} + dependencies: + end-of-stream: 1.4.4 + inherits: 2.0.4 + readable-stream: 2.3.8 + stream-shift: 1.0.1 + + /ecc-jsbn@0.1.2: + resolution: {integrity: sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==} + dependencies: + jsbn: 0.1.1 + safer-buffer: 2.1.2 + + /ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + dev: true + + /electron-to-chromium@1.4.620: + resolution: {integrity: sha512-a2fcSHOHrqBJsPNXtf6ZCEZpXrFCcbK1FBxfX3txoqWzNgtEDG1f3M59M98iwxhRW4iMKESnSjbJ310/rkrp0g==} + + /elliptic@6.5.4: + resolution: {integrity: sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==} + dependencies: + bn.js: 4.12.0 + brorand: 1.1.0 + hash.js: 1.1.7 + hmac-drbg: 1.0.1 + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + minimalistic-crypto-utils: 1.0.1 + + /email-addresses@3.1.0: + resolution: {integrity: sha512-k0/r7GrWVL32kZlGwfPNgB2Y/mMXVTq/decgLczm/j34whdaspNrZO8CnXPf1laaHxI6ptUlsnAxN+UAPw+fzg==} + dev: true + + /emoji-regex@7.0.3: + resolution: {integrity: sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==} + + /emojis-list@3.0.0: + resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} + engines: {node: '>= 4'} + + /encodeurl@1.0.2: + resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} + engines: {node: '>= 0.8'} + dev: true + + /encoding@0.1.13: + resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} + dependencies: + iconv-lite: 0.6.3 + dev: true + + /end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + dependencies: + once: 1.4.0 + + /enhanced-resolve@0.9.1: + resolution: {integrity: sha512-kxpoMgrdtkXZ5h0SeraBS1iRntpTpQ3R8ussdb38+UAFnMGX5DDyJXePm+OCHOcoXvHDw7mc2erbJBpDnl7TPw==} + engines: {node: '>=0.6'} + dependencies: + graceful-fs: 4.2.11 + memory-fs: 0.2.0 + tapable: 0.1.10 + dev: true + + /enhanced-resolve@4.5.0: + resolution: {integrity: sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==} + engines: {node: '>=6.9.0'} + dependencies: + graceful-fs: 4.2.11 + memory-fs: 0.5.0 + tapable: 1.1.3 + + /entities@1.1.2: + resolution: {integrity: sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==} + dev: false + + /entities@2.2.0: + resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} + + /entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + dev: true + + /enzyme-adapter-react-16@1.3.0(enzyme@3.10.0)(react-dom@16.14.0)(react@16.14.0): + resolution: {integrity: sha512-TRX+Y5QPreGmqfFU3bPsJUmqNZX9paQCmQ93kj7hnfQoZzufO/pahGN/OviWn60YcgaQojhf0AWv3PxrIDARbA==} + peerDependencies: + enzyme: ^3.0.0 + react: ^16.0.0-0 + react-dom: ^16.0.0-0 + dependencies: + enzyme: 3.10.0 + enzyme-adapter-utils: 1.14.1(react@16.14.0) + function.prototype.name: 1.1.6 + object.assign: 4.1.5 + object.values: 1.1.7 + prop-types: 15.8.1 + react: 16.14.0 + react-dom: 16.14.0(react@16.14.0) + react-is: 16.13.1 + react-test-renderer: 16.2.0(react@16.14.0) + dev: true + + /enzyme-adapter-utils@1.14.1(react@16.14.0): + resolution: {integrity: sha512-JZgMPF1QOI7IzBj24EZoDpaeG/p8Os7WeBZWTJydpsH7JRStc7jYbHE4CmNQaLqazaGFyLM8ALWA3IIZvxW3PQ==} + peerDependencies: + react: 0.13.x || 0.14.x || ^15.0.0-0 || ^16.0.0-0 + dependencies: + airbnb-prop-types: 2.16.0(react@16.14.0) + function.prototype.name: 1.1.6 + has: 1.0.4 + object.assign: 4.1.5 + object.fromentries: 2.0.7 + prop-types: 15.8.1 + react: 16.14.0 + semver: 5.7.2 + dev: true + + /enzyme@3.10.0: + resolution: {integrity: sha512-p2yy9Y7t/PFbPoTvrWde7JIYB2ZyGC+NgTNbVEGvZ5/EyoYSr9aG/2rSbVvyNvMHEhw9/dmGUJHWtfQIEiX9pg==} + dependencies: + array.prototype.flat: 1.3.2 + cheerio: 1.0.0-rc.12 + function.prototype.name: 1.1.6 + has: 1.0.4 + html-element-map: 1.3.1 + is-boolean-object: 1.1.2 + is-callable: 1.2.7 + is-number-object: 1.0.7 + is-regex: 1.1.4 + is-string: 1.0.7 + is-subset: 0.1.1 + lodash.escape: 4.0.1 + lodash.isequal: 4.5.0 + object-inspect: 1.13.1 + object-is: 1.1.5 + object.assign: 4.1.5 + object.entries: 1.1.7 + object.values: 1.1.7 + raf: 3.4.1 + rst-selector-parser: 2.2.3 + string.prototype.trim: 1.2.8 + dev: true + + /errno@0.1.8: + resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==} + hasBin: true + dependencies: + prr: 1.0.1 + + /error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + dependencies: + is-arrayish: 0.2.1 + + /es-abstract@1.22.3: + resolution: {integrity: sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==} + engines: {node: '>= 0.4'} + dependencies: + array-buffer-byte-length: 1.0.0 + arraybuffer.prototype.slice: 1.0.2 + available-typed-arrays: 1.0.5 + call-bind: 1.0.5 + es-set-tostringtag: 2.0.2 + es-to-primitive: 1.2.1 + function.prototype.name: 1.1.6 + get-intrinsic: 1.2.2 + get-symbol-description: 1.0.0 + globalthis: 1.0.3 + gopd: 1.0.1 + has-property-descriptors: 1.0.1 + has-proto: 1.0.1 + has-symbols: 1.0.3 + hasown: 2.0.0 + internal-slot: 1.0.6 + is-array-buffer: 3.0.2 + 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-typed-array: 1.1.12 + is-weakref: 1.0.2 + object-inspect: 1.13.1 + object-keys: 1.1.1 + object.assign: 4.1.5 + regexp.prototype.flags: 1.5.1 + safe-array-concat: 1.0.1 + safe-regex-test: 1.0.0 + string.prototype.trim: 1.2.8 + string.prototype.trimend: 1.0.7 + string.prototype.trimstart: 1.0.7 + typed-array-buffer: 1.0.0 + typed-array-byte-length: 1.0.0 + typed-array-byte-offset: 1.0.0 + typed-array-length: 1.0.4 + unbox-primitive: 1.0.2 + which-typed-array: 1.1.13 + dev: true + + /es-array-method-boxes-properly@1.0.0: + resolution: {integrity: sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==} + dev: true + + /es-set-tostringtag@2.0.2: + resolution: {integrity: sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.2 + has-tostringtag: 1.0.0 + hasown: 2.0.0 + dev: true + + /es-shim-unscopables@1.0.2: + resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} + dependencies: + hasown: 2.0.0 + dev: true + + /es-to-primitive@1.2.1: + resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} + engines: {node: '>= 0.4'} + dependencies: + is-callable: 1.2.7 + is-date-object: 1.0.5 + is-symbol: 1.0.4 + dev: true + + /es6-object-assign@1.1.0: + resolution: {integrity: sha512-MEl9uirslVwqQU369iHNWZXsI8yaZYGg/D65aOgZkeyFJwHYSxilf7rQzXKI7DdDuBPrBXbfk3sl9hJhmd5AUw==} + dev: false + + /es6-promise@3.0.2: + resolution: {integrity: sha512-CUD62/uqeE0L+EJeypOKuFfM56CFaH4vo+++J76bff0NkeQ2bBmWVCTNxL2hj9HeCYPkof6Gqea0BSeK17gBzA==} + dev: false + + /escalade@3.1.1: + resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} + engines: {node: '>=6'} + + /escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + dev: true + + /escape-latex@1.2.0: + resolution: {integrity: sha512-nV5aVWW1K0wEiUIEdZ4erkGGH8mDxGyxSeqPzRNtWP7ataw+/olFObw7hujFWlVjNsaDFw5VZ5NzVSIqRgfTiw==} + dev: false + + /escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + /escodegen@1.14.3: + resolution: {integrity: sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==} + engines: {node: '>=4.0'} + hasBin: true + dependencies: + esprima: 4.0.1 + estraverse: 4.3.0 + esutils: 2.0.3 + optionator: 0.8.3 + optionalDependencies: + source-map: 0.6.1 + dev: true + + /escodegen@1.9.1: + resolution: {integrity: sha512-6hTjO1NAWkHnDk3OqQ4YrCuwwmGHL9S3nPlzBOUG/R44rda3wLNrfvQ5fkSGjyhHFKM7ALPKcKGrwvCLe0lC7Q==} + engines: {node: '>=4.0'} + hasBin: true + dependencies: + esprima: 3.1.3 + estraverse: 4.3.0 + esutils: 2.0.3 + optionator: 0.8.3 + optionalDependencies: + source-map: 0.6.1 + dev: false + + /escodegen@2.1.0: + resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} + engines: {node: '>=6.0'} + hasBin: true + dependencies: + esprima: 4.0.1 + estraverse: 5.3.0 + esutils: 2.0.3 + optionalDependencies: + source-map: 0.6.1 + dev: false + + /eslint-config-scratch@6.0.0(babel-eslint@10.0.3)(eslint@5.16.0): + resolution: {integrity: sha512-2aW7EVWhjTrwaM54hjAZeRETh/habWeQ5xzTbPO2dG//RtixBztUAmdxqAHKH8MEtmAMsUhf3mRjO1BstO4dGg==} + peerDependencies: + babel-eslint: '>=8.0.1' + eslint: '>=5.3.0' + dependencies: + babel-eslint: 10.0.3(eslint@5.16.0) + eslint: 5.16.0 + optionalDependencies: + eslint-plugin-react: 7.24.0(eslint@5.16.0) + dev: true + + /eslint-import-resolver-node@0.3.9: + resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} + dependencies: + debug: 3.2.7(supports-color@6.1.0) + is-core-module: 2.13.1 + resolve: 1.22.8 + transitivePeerDependencies: + - supports-color + dev: true + + /eslint-import-resolver-webpack@0.11.1(eslint-plugin-import@2.23.4)(webpack@4.46.0): + resolution: {integrity: sha512-eK3zR7xVQR/MaoBWwGuD+CULYVuqe5QFlDukman71aI6IboCGzggDUohHNfu1ZeBnbHcUHJc0ywWoXUBNB6qdg==} + peerDependencies: + eslint-plugin-import: '>=1.4.0' + webpack: '>=1.11.0' + dependencies: + array-find: 1.0.0 + debug: 2.6.9(supports-color@6.1.0) + enhanced-resolve: 0.9.1 + eslint-plugin-import: 2.23.4(eslint-import-resolver-webpack@0.11.1)(eslint@5.16.0) + find-root: 1.1.0 + has: 1.0.4 + interpret: 1.4.0 + lodash: 4.17.21 + node-libs-browser: 2.2.1 + resolve: 1.22.8 + semver: 5.7.2 + webpack: 4.46.0(webpack-cli@3.3.12) + transitivePeerDependencies: + - supports-color + dev: true + + /eslint-module-utils@2.8.0(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-webpack@0.11.1)(eslint@5.16.0): + resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: '*' + eslint-import-resolver-node: '*' + eslint-import-resolver-typescript: '*' + eslint-import-resolver-webpack: '*' + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + eslint: + optional: true + eslint-import-resolver-node: + optional: true + eslint-import-resolver-typescript: + optional: true + eslint-import-resolver-webpack: + optional: true + dependencies: + debug: 3.2.7(supports-color@6.1.0) + eslint: 5.16.0 + eslint-import-resolver-node: 0.3.9 + eslint-import-resolver-webpack: 0.11.1(eslint-plugin-import@2.23.4)(webpack@4.46.0) + transitivePeerDependencies: + - supports-color + dev: true + + /eslint-plugin-import@2.23.4(eslint-import-resolver-webpack@0.11.1)(eslint@5.16.0): + resolution: {integrity: sha512-6/wP8zZRsnQFiR3iaPFgh5ImVRM1WN5NUWfTIRqwOdeiGJlBcSk82o1FEVq8yXmy4lkIzTo7YhHCIxlU/2HyEQ==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + dependencies: + array-includes: 3.1.7 + array.prototype.flat: 1.3.2 + debug: 2.6.9(supports-color@6.1.0) + doctrine: 2.1.0 + eslint: 5.16.0 + eslint-import-resolver-node: 0.3.9 + eslint-module-utils: 2.8.0(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-webpack@0.11.1)(eslint@5.16.0) + find-up: 2.1.0 + has: 1.0.4 + is-core-module: 2.13.1 + minimatch: 3.1.2 + object.values: 1.1.7 + pkg-up: 2.0.0 + read-pkg-up: 3.0.0 + resolve: 1.22.8 + tsconfig-paths: 3.15.0 + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + dev: true + + /eslint-plugin-jest@22.17.0(eslint@5.16.0): + resolution: {integrity: sha512-WT4DP4RoGBhIQjv+5D0FM20fAdAUstfYAf/mkufLNTojsfgzc5/IYW22cIg/Q4QBavAZsROQlqppiWDpFZDS8Q==} + engines: {node: '>=6'} + peerDependencies: + eslint: '>=5' + dependencies: + '@typescript-eslint/experimental-utils': 1.13.0(eslint@5.16.0) + eslint: 5.16.0 + dev: true + + /eslint-plugin-react@7.24.0(eslint@5.16.0): + resolution: {integrity: sha512-KJJIx2SYx7PBx3ONe/mEeMz4YE0Lcr7feJTCMyyKb/341NcjuAgim3Acgan89GfPv7nxXK2+0slu0CWXYM4x+Q==} + engines: {node: '>=4'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 + dependencies: + array-includes: 3.1.7 + array.prototype.flatmap: 1.3.2 + doctrine: 2.1.0 + eslint: 5.16.0 + has: 1.0.4 + jsx-ast-utils: 3.3.5 + minimatch: 3.1.2 + object.entries: 1.1.7 + object.fromentries: 2.0.7 + object.values: 1.1.7 + prop-types: 15.8.1 + resolve: 2.0.0-next.5 + string.prototype.matchall: 4.0.10 + dev: true + + /eslint-scope@4.0.3: + resolution: {integrity: sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==} + engines: {node: '>=4.0.0'} + dependencies: + esrecurse: 4.3.0 + estraverse: 4.3.0 + + /eslint-utils@1.4.3: + resolution: {integrity: sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==} + engines: {node: '>=6'} + dependencies: + eslint-visitor-keys: 1.3.0 + dev: true + + /eslint-visitor-keys@1.3.0: + resolution: {integrity: sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==} + engines: {node: '>=4'} + dev: true + + /eslint@5.16.0: + resolution: {integrity: sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg==} + engines: {node: ^6.14.0 || ^8.10.0 || >=9.10.0} + hasBin: true + dependencies: + '@babel/code-frame': 7.23.5 + ajv: 6.12.6 + chalk: 2.4.2 + cross-spawn: 6.0.5 + debug: 4.3.4(supports-color@6.1.0) + doctrine: 3.0.0 + eslint-scope: 4.0.3 + eslint-utils: 1.4.3 + eslint-visitor-keys: 1.3.0 + espree: 5.0.1 + esquery: 1.5.0 + esutils: 2.0.3 + file-entry-cache: 5.0.1 + functional-red-black-tree: 1.0.1 + glob: 7.2.3 + globals: 11.12.0 + ignore: 4.0.6 + import-fresh: 3.3.0 + imurmurhash: 0.1.4 + inquirer: 6.5.2 + js-yaml: 3.14.1 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.3.0 + lodash: 4.17.21 + minimatch: 3.1.2 + mkdirp: 0.5.6 + natural-compare: 1.4.0 + optionator: 0.8.3 + path-is-inside: 1.0.2 + progress: 2.0.3 + regexpp: 2.0.1 + semver: 5.7.2 + strip-ansi: 4.0.0 + strip-json-comments: 2.0.1 + table: 5.4.6 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + dev: true + + /espree@5.0.1: + resolution: {integrity: sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A==} + engines: {node: '>=6.0.0'} + dependencies: + acorn: 6.4.2 + acorn-jsx: 5.3.2(acorn@6.4.2) + eslint-visitor-keys: 1.3.0 + dev: true + + /esprima@3.1.3: + resolution: {integrity: sha512-AWwVMNxwhN8+NIPQzAQZCm7RkLC4RbM3B1OobMuyp3i+w73X57KCKaVIxaRZb+DYCojq7rspo+fmuQfAboyhFg==} + engines: {node: '>=4'} + hasBin: true + dev: false + + /esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + /esquery@1.5.0: + resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + engines: {node: '>=0.10'} + dependencies: + estraverse: 5.3.0 + dev: true + + /esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + dependencies: + estraverse: 5.3.0 + + /estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + + /estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + /esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + /etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + dev: true + + /eventemitter3@4.0.7: + resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + dev: true + + /events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + + /eventsource@2.0.2: + resolution: {integrity: sha512-IzUmBGPR3+oUG9dUeXynyNmf91/3zUSJg1lCktzKw47OXuhco54U3r9B7O4XX+Rb1Itm9OZ2b0RkTs10bICOxA==} + engines: {node: '>=12.0.0'} + dev: true + + /evp_bytestokey@1.0.3: + resolution: {integrity: sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==} + dependencies: + md5.js: 1.3.5 + safe-buffer: 5.2.1 + + /exec-sh@0.2.2: + resolution: {integrity: sha512-FIUCJz1RbuS0FKTdaAafAByGS0CPvU3R0MeHxgtl+djzCc//F8HakL8GzmVNZanasTbTAY/3DRFA0KpVqj/eAw==} + dependencies: + merge: 1.2.1 + dev: true + + /execa@0.7.0: + resolution: {integrity: sha512-RztN09XglpYI7aBBrJCPW95jEH7YF1UEPOoX9yDhUTPdp7mK+CQvnLTuD10BNXZ3byLTu2uehZ8EcKT/4CGiFw==} + engines: {node: '>=4'} + dependencies: + cross-spawn: 5.1.0 + get-stream: 3.0.0 + is-stream: 1.1.0 + npm-run-path: 2.0.2 + p-finally: 1.0.0 + signal-exit: 3.0.7 + strip-eof: 1.0.0 + dev: true + + /execa@1.0.0: + resolution: {integrity: sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==} + engines: {node: '>=6'} + dependencies: + cross-spawn: 6.0.5 + get-stream: 4.1.0 + is-stream: 1.1.0 + npm-run-path: 2.0.2 + p-finally: 1.0.0 + signal-exit: 3.0.7 + strip-eof: 1.0.0 + dev: true + + /exenv@1.2.2: + resolution: {integrity: sha512-Z+ktTxTwv9ILfgKCk32OX3n/doe+OcLTRtqK9pcL+JsP3J1/VW8Uvl4ZjLlKqeW4rzK4oesDOGMEMRIZqtP4Iw==} + dev: false + + /expand-brackets@0.1.5: + resolution: {integrity: sha512-hxx03P2dJxss6ceIeri9cmYOT4SRs3Zk3afZwWpOsRqLqprhTR8u++SlC+sFGsQr7WGFPdMF7Gjc1njDLDK6UA==} + engines: {node: '>=0.10.0'} + dependencies: + is-posix-bracket: 0.1.1 + dev: true + + /expand-brackets@2.1.4(supports-color@6.1.0): + resolution: {integrity: sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==} + engines: {node: '>=0.10.0'} + dependencies: + debug: 2.6.9(supports-color@6.1.0) + define-property: 0.2.5 + extend-shallow: 2.0.1 + posix-character-classes: 0.1.1 + regex-not: 1.0.2 + snapdragon: 0.8.2(supports-color@6.1.0) + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + + /expand-range@1.8.2: + resolution: {integrity: sha512-AFASGfIlnIbkKPQwX1yHaDjFvh/1gyKJODme52V6IORh69uEYgZp0o9C+qsIGNVEiuuhQU0CSSl++Rlegg1qvA==} + engines: {node: '>=0.10.0'} + dependencies: + fill-range: 2.2.4 + dev: true + + /expand-tilde@2.0.2: + resolution: {integrity: sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==} + engines: {node: '>=0.10.0'} + dependencies: + homedir-polyfill: 1.0.3 + + /expect@21.2.1: + resolution: {integrity: sha512-orfQQqFRTX0jH7znRIGi8ZMR8kTNpXklTTz8+HGTpmTKZo3Occ6JNB5FXMb8cRuiiC/GyDqsr30zUa66ACYlYw==} + dependencies: + ansi-styles: 3.2.1 + 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 + dev: true + + /express@4.18.2(supports-color@6.1.0): + resolution: {integrity: sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==} + engines: {node: '>= 0.10.0'} + dependencies: + accepts: 1.3.8 + array-flatten: 1.1.1 + body-parser: 1.20.1(supports-color@6.1.0) + content-disposition: 0.5.4 + content-type: 1.0.5 + cookie: 0.5.0 + cookie-signature: 1.0.6 + debug: 2.6.9(supports-color@6.1.0) + depd: 2.0.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 1.2.0(supports-color@6.1.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(supports-color@6.1.0) + serve-static: 1.15.0(supports-color@6.1.0) + setprototypeof: 1.2.0 + statuses: 2.0.1 + type-is: 1.6.18 + utils-merge: 1.0.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + dev: true + + /ext-list@2.2.2: + resolution: {integrity: sha512-u+SQgsubraE6zItfVA0tBuCBhfU9ogSRnsvygI7wht9TS510oLkBRXBsqopeUG/GBOIQyKZO9wjTqIu/sf5zFA==} + engines: {node: '>=0.10.0'} + dependencies: + mime-db: 1.52.0 + dev: false + + /ext-name@5.0.0: + resolution: {integrity: sha512-yblEwXAbGv1VQDmow7s38W77hzAgJAO50ztBLMcUyUBfxv1HC+LGwtiEN+Co6LtlqT/5uwVOxsD4TNIilWhwdQ==} + engines: {node: '>=4'} + dependencies: + ext-list: 2.2.2 + sort-keys-length: 1.0.1 + dev: false + + /extend-shallow@2.0.1: + resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} + engines: {node: '>=0.10.0'} + dependencies: + is-extendable: 0.1.1 + + /extend-shallow@3.0.2: + resolution: {integrity: sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==} + engines: {node: '>=0.10.0'} + dependencies: + assign-symbols: 1.0.0 + is-extendable: 1.0.1 + + /extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + + /external-editor@3.1.0: + resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} + engines: {node: '>=4'} + dependencies: + chardet: 0.7.0 + iconv-lite: 0.4.24 + tmp: 0.0.33 + dev: true + + /extglob@0.3.2: + resolution: {integrity: sha512-1FOj1LOwn42TMrruOHGt18HemVnbwAmAak7krWk+wa93KXxGbK+2jpezm+ytJYDaBX0/SPLZFHKM7m+tKobWGg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 1.0.0 + dev: true + + /extglob@2.0.4(supports-color@6.1.0): + resolution: {integrity: sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==} + engines: {node: '>=0.10.0'} + dependencies: + array-unique: 0.3.2 + define-property: 1.0.0 + expand-brackets: 2.1.4(supports-color@6.1.0) + extend-shallow: 2.0.1 + fragment-cache: 0.2.1 + regex-not: 1.0.2 + snapdragon: 0.8.2(supports-color@6.1.0) + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + + /extract-zip@2.0.1: + resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} + engines: {node: '>= 10.17.0'} + hasBin: true + dependencies: + debug: 4.3.4(supports-color@6.1.0) + get-stream: 5.2.0 + yauzl: 2.10.0 + optionalDependencies: + '@types/yauzl': 2.10.3 + transitivePeerDependencies: + - supports-color + dev: true + + /extsprintf@1.3.0: + resolution: {integrity: sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==} + engines: {'0': node >=0.6.0} + + /falafel@2.2.5: + resolution: {integrity: sha512-HuC1qF9iTnHDnML9YZAdCDQwT0yKl/U55K4XSUXqGAA2GLoafFgWRqdAbhWJxXaYD4pyoVxAJ8wH670jMpI9DQ==} + engines: {node: '>=0.4.0'} + dependencies: + acorn: 7.4.1 + isarray: 2.0.5 + dev: false + + /fast-deep-equal@1.1.0: + resolution: {integrity: sha512-fueX787WZKCV0Is4/T2cyAdM4+x1S3MXXOAhavE1ys/W42SHAPacLTQhucja22QBYrfGw50M2sRiXPtTGv9Ymw==} + dev: false + + /fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + /fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + + /fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + /fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + /fastestsmallesttextencoderdecoder@1.0.22: + resolution: {integrity: sha512-Pb8d48e+oIuY4MaM64Cd7OW1gt4nxCHs7/ddPPZ/Ic3sg8yVGM7O9wDvZ7us6ScaUupzM+pfBolwtYhN1IxBIw==} + dev: false + + /fastparse@1.1.2: + resolution: {integrity: sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==} + dev: false + + /fastq@1.16.0: + resolution: {integrity: sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==} + dependencies: + reusify: 1.0.4 + + /faye-websocket@0.11.4: + resolution: {integrity: sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==} + engines: {node: '>=0.8.0'} + dependencies: + websocket-driver: 0.7.4 + dev: true + + /fb-watchman@2.0.2: + resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} + dependencies: + bser: 2.1.1 + dev: true + + /fbjs@0.8.18: + resolution: {integrity: sha512-EQaWFK+fEPSoibjNy8IxUtaFOMXcWsY0JaVrQoZR9zC8N2Ygf9iDITPWjUTVIax95b6I742JFLqASHfsag/vKA==} + dependencies: + core-js: 1.2.7 + isomorphic-fetch: 2.2.1 + loose-envify: 1.4.0 + object-assign: 4.1.1 + promise: 7.3.1 + setimmediate: 1.0.5 + ua-parser-js: 0.7.37 + dev: true + + /fd-slicer@1.1.0: + resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} + dependencies: + pend: 1.2.0 + + /figgy-pudding@3.5.2: + resolution: {integrity: sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==} + deprecated: This module is no longer supported. + + /figures@1.7.0: + resolution: {integrity: sha512-UxKlfCRuCBxSXU4C6t9scbDyWZ4VlaFFdojKtzJuSkuOBQ5CNFum+zZXFwHjo+CxBC1t6zlYPgHIgFjL8ggoEQ==} + engines: {node: '>=0.10.0'} + dependencies: + escape-string-regexp: 1.0.5 + object-assign: 4.1.1 + dev: false + + /figures@2.0.0: + resolution: {integrity: sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==} + engines: {node: '>=4'} + dependencies: + escape-string-regexp: 1.0.5 + dev: true + + /file-entry-cache@5.0.1: + resolution: {integrity: sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==} + engines: {node: '>=4'} + dependencies: + flat-cache: 2.0.1 + dev: true + + /file-loader@2.0.0(webpack@4.46.0): + resolution: {integrity: sha512-YCsBfd1ZGCyonOKLxPiKPdu+8ld9HAaMEvJewzz+b2eTF7uL5Zm/HdBF6FjCrpCMRq25Mi0U1gl4pwn2TlH7hQ==} + engines: {node: '>= 6.9.0 < 7.0.0 || >= 8.9.0'} + peerDependencies: + webpack: ^2.0.0 || ^3.0.0 || ^4.0.0 + dependencies: + loader-utils: 1.4.2 + schema-utils: 1.0.0 + webpack: 4.46.0(webpack-cli@3.3.12) + + /file-type@11.1.0: + resolution: {integrity: sha512-rM0UO7Qm9K7TWTtA6AShI/t7H5BPjDeGVDaNyg9BjHAj3PysKy7+8C8D137R88jnR3rFJZQB/tFgydl5sN5m7g==} + engines: {node: '>=6'} + dev: false + + /file-type@3.9.0: + resolution: {integrity: sha512-RLoqTXE8/vPmMuTI88DAzhMYC99I8BWv7zYP4A1puo5HIjEJ5EX48ighy4ZyKMG9EDXxBgW6e++cn7d1xuFghA==} + engines: {node: '>=0.10.0'} + dev: false + + /file-type@4.4.0: + resolution: {integrity: sha512-f2UbFQEk7LXgWpi5ntcO86OeA/cC80fuDDDaX/fZ2ZGel+AF7leRQqBBW1eJNiiQkrZlAoM6P+VYP5P6bOlDEQ==} + engines: {node: '>=4'} + dev: false + + /file-type@5.2.0: + resolution: {integrity: sha512-Iq1nJ6D2+yIO4c8HHg4fyVb8mAJieo1Oloy1mLLaB2PvezNedhBVm+QU7g0qM42aiMbRXTxKKwGD17rjKNJYVQ==} + engines: {node: '>=4'} + dev: false + + /file-type@6.2.0: + resolution: {integrity: sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==} + engines: {node: '>=4'} + dev: false + + /file-uri-to-path@1.0.0: + resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} + requiresBuild: true + optional: true + + /filename-regex@2.0.1: + resolution: {integrity: sha512-BTCqyBaWBTsauvnHiE8i562+EdJj+oUpkqWp2R1iCoR8f6oo8STRu3of7WJJ0TqWtxN50a5YFpzYK4Jj9esYfQ==} + engines: {node: '>=0.10.0'} + dev: true + + /filename-reserved-regex@1.0.0: + resolution: {integrity: sha512-UZArj7+U+2reBBVCvVmRlyq9D7EYQdUtuNN+1iz7pF1jGcJ2L0TjiRCxsTZfj2xFbM4c25uGCUDpKTHA7L2TKg==} + engines: {node: '>=0.10.0'} + dev: true + + /filename-reserved-regex@2.0.0: + resolution: {integrity: sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ==} + engines: {node: '>=4'} + + /filenamify-url@1.0.0: + resolution: {integrity: sha512-O9K9JcZeF5VdZWM1qR92NSv1WY2EofwudQayPx5dbnnFl9k0IcZha4eV/FGkjnBK+1irOQInij0yiooCHu/0Fg==} + engines: {node: '>=0.10.0'} + dependencies: + filenamify: 1.2.1 + humanize-url: 1.0.1 + dev: true + + /filenamify@1.2.1: + resolution: {integrity: sha512-DKVP0WQcB7WaIMSwDETqImRej2fepPqvXQjaVib7LRZn9Rxn5UbvK2tYTqGf1A1DkIprQQkG4XSQXSOZp7Q3GQ==} + engines: {node: '>=0.10.0'} + dependencies: + filename-reserved-regex: 1.0.0 + strip-outer: 1.0.1 + trim-repeated: 1.0.0 + dev: true + + /filenamify@3.0.0: + resolution: {integrity: sha512-5EFZ//MsvJgXjBAFJ+Bh2YaCTRF/VP1YOmGrgt+KJ4SFRLjI87EIdwLLuT6wQX0I4F9W41xutobzczjsOKlI/g==} + engines: {node: '>=6'} + dependencies: + filename-reserved-regex: 2.0.0 + strip-outer: 1.0.1 + trim-repeated: 1.0.0 + dev: false + + /filenamify@4.3.0: + resolution: {integrity: sha512-hcFKyUG57yWGAzu1CMt/dPzYZuv+jAJUT85bL8mrXvNe6hWj6yEHEc4EdcgiA6Z3oi1/9wXJdZPXF2dZNgwgOg==} + engines: {node: '>=8'} + dependencies: + filename-reserved-regex: 2.0.0 + strip-outer: 1.0.1 + trim-repeated: 1.0.0 + dev: true + + /fileset@2.0.3: + resolution: {integrity: sha512-UxowFKnAFIwtmSxgKjWAVgjE3Fk7MQJT0ZIyl0NwIFZTrx4913rLaonGJ84V+x/2+w/pe4ULHRns+GZPs1TVuw==} + dependencies: + glob: 7.2.3 + minimatch: 3.1.2 + dev: true + + /fill-range@2.2.4: + resolution: {integrity: sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==} + engines: {node: '>=0.10.0'} + dependencies: + is-number: 2.1.0 + isobject: 2.1.0 + randomatic: 3.1.1 + repeat-element: 1.1.4 + repeat-string: 1.6.1 + dev: true + + /fill-range@4.0.0: + resolution: {integrity: sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==} + engines: {node: '>=0.10.0'} + requiresBuild: true + dependencies: + extend-shallow: 2.0.1 + is-number: 3.0.0 + repeat-string: 1.6.1 + to-regex-range: 2.1.1 + + /fill-range@7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + requiresBuild: true + dependencies: + to-regex-range: 5.0.1 + + /finalhandler@1.2.0(supports-color@6.1.0): + resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} + engines: {node: '>= 0.8'} + dependencies: + debug: 2.6.9(supports-color@6.1.0) + 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 + transitivePeerDependencies: + - supports-color + dev: true + + /find-cache-dir@1.0.0: + resolution: {integrity: sha512-46TFiBOzX7xq/PcSWfFwkyjpemdRnMe31UQF+os0y+1W3k95f6R4SEt02Hj4p3X0Mir9gfrkmOtshFidS0VPUg==} + engines: {node: '>=4'} + dependencies: + commondir: 1.0.1 + make-dir: 1.3.0 + pkg-dir: 2.0.0 + dev: true + + /find-cache-dir@2.1.0: + resolution: {integrity: sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==} + engines: {node: '>=6'} + dependencies: + commondir: 1.0.1 + make-dir: 2.1.0 + pkg-dir: 3.0.0 + + /find-cache-dir@3.3.2: + resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==} + engines: {node: '>=8'} + dependencies: + commondir: 1.0.1 + make-dir: 3.1.0 + pkg-dir: 4.2.0 + + /find-root@1.1.0: + resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} + dev: true + + /find-up@1.1.2: + resolution: {integrity: sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==} + engines: {node: '>=0.10.0'} + dependencies: + path-exists: 2.1.0 + pinkie-promise: 2.0.1 + dev: true + + /find-up@2.1.0: + resolution: {integrity: sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==} + engines: {node: '>=4'} + dependencies: + locate-path: 2.0.0 + dev: true + + /find-up@3.0.0: + resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} + engines: {node: '>=6'} + dependencies: + locate-path: 3.0.0 + + /find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + + /findup-sync@3.0.0(supports-color@6.1.0): + resolution: {integrity: sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==} + engines: {node: '>= 0.10'} + dependencies: + detect-file: 1.0.0 + is-glob: 4.0.3 + micromatch: 3.1.10(supports-color@6.1.0) + resolve-dir: 1.0.1 + transitivePeerDependencies: + - supports-color + + /findup@0.1.5: + resolution: {integrity: sha512-Udxo3C9A6alt2GZ2MNsgnIvX7De0V3VGxeP/x98NSVgSlizcDHdmJza61LI7zJy4OEtSiJyE72s0/+tBl5/ZxA==} + engines: {node: '>=0.6'} + hasBin: true + dependencies: + colors: 0.6.2 + commander: 2.1.0 + dev: false + + /flat-cache@2.0.1: + resolution: {integrity: sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==} + engines: {node: '>=4'} + dependencies: + flatted: 2.0.2 + rimraf: 2.6.3 + write: 1.0.3 + dev: true + + /flatted@2.0.2: + resolution: {integrity: sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==} + dev: true + + /flush-write-stream@1.1.1: + resolution: {integrity: sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==} + dependencies: + inherits: 2.0.4 + readable-stream: 2.3.8 + + /follow-redirects@1.15.4(debug@4.3.4): + resolution: {integrity: sha512-Cr4D/5wlrb0z9dgERpUL3LrmPKVDsETIJhaCMeDfuFYcqa5bldGV6wBsAN6X/vxlXQtFBMrXdXxdL8CbDTGniw==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + dependencies: + debug: 4.3.4(supports-color@6.1.0) + dev: true + + /for-each@0.3.3: + resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + dependencies: + is-callable: 1.2.7 + dev: true + + /for-in@1.0.2: + resolution: {integrity: sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==} + engines: {node: '>=0.10.0'} + + /for-own@0.1.5: + resolution: {integrity: sha512-SKmowqGTJoPzLO1T0BBJpkfp3EMacCMOuH40hOUbrbzElVktk4DioXVM99QkLCyKoiuOmyjgcWMpVz2xjE7LZw==} + engines: {node: '>=0.10.0'} + dependencies: + for-in: 1.0.2 + dev: true + + /forever-agent@0.6.1: + resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==} + + /form-data@2.3.3: + resolution: {integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==} + engines: {node: '>= 0.12'} + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + + /form-data@4.0.0: + resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + engines: {node: '>= 6'} + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + dev: true + + /format-message-formats@6.2.4: + resolution: {integrity: sha512-smT/fAqBLqusWfWCKRAx6QBDAAbmYznWsIyTyk66COmvwt2Byiqd7SJe2ma9a5oV0kwRaOJpN/F4lr4YK/n6qQ==} + dev: false + + /format-message-interpret@6.2.4: + resolution: {integrity: sha512-dRvz9mXhITApyOtfuFEb/XqvCe1u6RMkQW49UJHXS8w2S8cAHCqq5LNDFK+QK6XVzcofROycLb/k1uybTAKt2w==} + dependencies: + format-message-formats: 6.2.4 + lookup-closest-locale: 6.2.0 + dev: false + + /format-message-parse@6.2.4: + resolution: {integrity: sha512-k7WqXkEzgXkW4wkHdS6Cv2Ou0rIFtiDelZjgoe1saW4p7FT7zS8OeAUpAekhormqzpeecR97e4vBft1zMsfFOQ==} + dev: false + + /format-message@6.2.1: + resolution: {integrity: sha512-6gBXI+MOE9pu9QNeZf95V87GKYiLCdUvhisjts75xonaPAshtBu20NTZt2l8kbYcoMtxNyH9E9af+aieIRfVmw==} + dependencies: + format-message-formats: 6.2.4 + format-message-interpret: 6.2.4 + format-message-parse: 6.2.4 + lookup-closest-locale: 6.2.0 + dev: false + + /forwarded@0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + dev: true + + /fraction.js@4.3.4: + resolution: {integrity: sha512-pwiTgt0Q7t+GHZA4yaLjObx4vXmmdcS0iSJ19o8d/goUGgItX9UZWKWNnLHehxviD8wU2IWRsnR8cD5+yOJP2Q==} + dev: false + + /fragment-cache@0.2.1: + resolution: {integrity: sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==} + engines: {node: '>=0.10.0'} + dependencies: + map-cache: 0.2.2 + + /fresh@0.5.2: + resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} + engines: {node: '>= 0.6'} + dev: true + + /from2-array@0.0.4: + resolution: {integrity: sha512-0G0cAp7sYLobH7ALsr835x98PU/YeVF7wlwxdWbCUaea7wsa7lJfKZUAo6p2YZGZ8F94luCuqHZS3JtFER6uPg==} + dependencies: + from2: 2.3.0 + dev: false + + /from2@2.3.0: + resolution: {integrity: sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==} + dependencies: + inherits: 2.0.4 + readable-stream: 2.3.8 + + /fs-constants@1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + dev: false + + /fs-extra@5.0.0: + resolution: {integrity: sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==} + dependencies: + graceful-fs: 4.1.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + dev: true + + /fs-extra@8.1.0: + resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} + engines: {node: '>=6 <7 || >=8'} + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + + /fs-minipass@2.1.0: + resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} + engines: {node: '>= 8'} + dependencies: + minipass: 3.3.6 + dev: false + + /fs-readdir-recursive@1.1.0: + resolution: {integrity: sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==} + + /fs-write-stream-atomic@1.0.10: + resolution: {integrity: sha512-gehEzmPn2nAwr39eay+x3X34Ra+M2QlVUTLhkXPjWdeO8RF9kszk116avgBJM3ZyNHgHXBNx+VmPaFC36k0PzA==} + dependencies: + graceful-fs: 4.2.11 + iferr: 0.1.5 + imurmurhash: 0.1.4 + readable-stream: 2.3.8 + + /fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + /fsevents@1.2.13: + resolution: {integrity: sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==} + engines: {node: '>= 4.0'} + os: [darwin] + deprecated: The v1 package contains DANGEROUS / INSECURE binaries. Upgrade to safe fsevents v2 + requiresBuild: true + dependencies: + bindings: 1.5.0 + nan: 2.18.0 + optional: true + + /fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + optional: true + + /function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + /function.prototype.name@1.1.6: + resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + functions-have-names: 1.2.3 + dev: true + + /functional-red-black-tree@1.0.1: + resolution: {integrity: sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==} + dev: true + + /functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + dev: true + + /gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + /get-caller-file@1.0.3: + resolution: {integrity: sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==} + dev: true + + /get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + /get-float-time-domain-data@0.1.0: + resolution: {integrity: sha512-6lWdVMny7vJ+xWxGUmVdSW7rd4L2byptiVkjH3QEBsxcHSa8UbC/HsZmixHK/ZQ1EYsOaQjaeRgR+NAsIerEJQ==} + dev: false + + /get-intrinsic@1.2.2: + resolution: {integrity: sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==} + dependencies: + function-bind: 1.1.2 + has-proto: 1.0.1 + has-symbols: 1.0.3 + hasown: 2.0.0 + + /get-stream@2.3.1: + resolution: {integrity: sha512-AUGhbbemXxrZJRD5cDvKtQxLuYaIbNtDTK8YqupCI393Q2KSTreEsLUN3ZxAWFGiKTzL6nKuzfcIvieflUX9qA==} + engines: {node: '>=0.10.0'} + dependencies: + object-assign: 4.1.1 + pinkie-promise: 2.0.1 + dev: false + + /get-stream@3.0.0: + resolution: {integrity: sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==} + engines: {node: '>=4'} + + /get-stream@4.1.0: + resolution: {integrity: sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==} + engines: {node: '>=6'} + dependencies: + pump: 3.0.0 + + /get-stream@5.2.0: + resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} + engines: {node: '>=8'} + dependencies: + pump: 3.0.0 + dev: true + + /get-symbol-description@1.0.0: + resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + get-intrinsic: 1.2.2 + dev: true + + /get-user-media-promise@1.1.4: + resolution: {integrity: sha512-k49YuV2z0d3gKHLPTFKYfzEA9kduuQk7YBf8ev2dxrKk+DhMyuzfQnK9ZSxkEhE/jv3BZY62M0eICWa7lak9nw==} + dev: false + + /get-value@2.0.6: + resolution: {integrity: sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==} + engines: {node: '>=0.10.0'} + + /getpass@0.1.7: + resolution: {integrity: sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==} + dependencies: + assert-plus: 1.0.0 + + /gh-pages@1.2.0: + resolution: {integrity: sha512-cGLYAvxtlQ1iTwAS4g7FreZPXoE/g62Fsxln2mmR19mgs4zZI+XJ+wVVUhBFCF/0+Nmvbq+abyTWue1m1BSnmg==} + engines: {node: '>=4'} + hasBin: true + dependencies: + async: 2.6.1 + commander: 2.15.1 + filenamify-url: 1.0.0 + fs-extra: 5.0.0 + globby: 6.1.0 + graceful-fs: 4.1.11 + rimraf: 2.7.1 + dev: true + + /gh-pages@3.2.3: + resolution: {integrity: sha512-jA1PbapQ1jqzacECfjUaO9gV8uBgU6XNMV0oXLtfCX3haGLe5Atq8BxlrADhbD6/UdG9j6tZLWAkAybndOXTJg==} + engines: {node: '>=10'} + hasBin: true + dependencies: + async: 2.6.4 + commander: 2.20.3 + email-addresses: 3.1.0 + filenamify: 4.3.0 + find-cache-dir: 3.3.2 + fs-extra: 8.1.0 + globby: 6.1.0 + dev: true + + /glob-base@0.3.0: + resolution: {integrity: sha512-ab1S1g1EbO7YzauaJLkgLp7DZVAqj9M/dvKlTt8DkXA2tiOIcSMrlVI2J1RZyB5iJVccEscjGn+kpOG9788MHA==} + engines: {node: '>=0.10.0'} + dependencies: + glob-parent: 2.0.0 + is-glob: 2.0.1 + dev: true + + /glob-parent@2.0.0: + resolution: {integrity: sha512-JDYOvfxio/t42HKdxkAYaCiBN7oYiuxykOxKxdaUW5Qn0zaYN3gRQWolrwdnf0shM9/EP0ebuuTmyoXNr1cC5w==} + dependencies: + is-glob: 2.0.1 + dev: true + + /glob-parent@3.1.0: + resolution: {integrity: sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==} + dependencies: + is-glob: 3.1.0 + path-dirname: 1.0.2 + + /glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + + /glob@7.1.2: + resolution: {integrity: sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: false + + /glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + /global-modules@1.0.0: + resolution: {integrity: sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==} + engines: {node: '>=0.10.0'} + dependencies: + global-prefix: 1.0.2 + is-windows: 1.0.2 + resolve-dir: 1.0.1 + + /global-modules@2.0.0: + resolution: {integrity: sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==} + engines: {node: '>=6'} + dependencies: + global-prefix: 3.0.0 + + /global-prefix@1.0.2: + resolution: {integrity: sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==} + engines: {node: '>=0.10.0'} + dependencies: + expand-tilde: 2.0.2 + homedir-polyfill: 1.0.3 + ini: 1.3.8 + is-windows: 1.0.2 + which: 1.3.1 + + /global-prefix@3.0.0: + resolution: {integrity: sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==} + engines: {node: '>=6'} + dependencies: + ini: 1.3.8 + kind-of: 6.0.3 + which: 1.3.1 + + /global@4.3.2: + resolution: {integrity: sha512-/4AybdwIDU4HkCUbJkZdWpe4P6vuw/CUtu+0I1YlLIPe7OlUO7KNJ+q/rO70CW2/NW6Jc6I62++Hzsf5Alu6rQ==} + dependencies: + min-document: 2.19.0 + process: 0.5.2 + dev: false + + /global@4.4.0: + resolution: {integrity: sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==} + dependencies: + min-document: 2.19.0 + process: 0.11.10 + dev: false + + /globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + + /globals@9.18.0: + resolution: {integrity: sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==} + engines: {node: '>=0.10.0'} + dev: true + + /globalthis@1.0.3: + resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} + engines: {node: '>= 0.4'} + dependencies: + define-properties: 1.2.1 + dev: true + + /globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.2 + ignore: 5.3.0 + merge2: 1.4.1 + slash: 3.0.0 + + /globby@6.1.0: + resolution: {integrity: sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw==} + engines: {node: '>=0.10.0'} + dependencies: + array-union: 1.0.2 + glob: 7.2.3 + object-assign: 4.1.1 + pify: 2.3.0 + pinkie-promise: 2.0.1 + dev: true + + /gopd@1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + dependencies: + get-intrinsic: 1.2.2 + + /got@8.3.2: + resolution: {integrity: sha512-qjUJ5U/hawxosMryILofZCkm3C84PLJS/0grRIpjAwu+Lkxxj5cxeCU25BG0/3mDSpXKTyZr8oh8wIgLaH0QCw==} + engines: {node: '>=4'} + dependencies: + '@sindresorhus/is': 0.7.0 + '@types/keyv': 3.1.4 + '@types/responselike': 1.0.3 + cacheable-request: 2.1.4 + decompress-response: 3.3.0 + duplexer3: 0.1.5 + get-stream: 3.0.0 + into-stream: 3.1.0 + is-retry-allowed: 1.2.0 + isurl: 1.0.0 + lowercase-keys: 1.0.1 + mimic-response: 1.0.1 + p-cancelable: 0.4.1 + p-timeout: 2.0.1 + pify: 3.0.0 + safe-buffer: 5.2.1 + timed-out: 4.0.1 + url-parse-lax: 3.0.0 + url-to-options: 1.0.1 + dev: false + + /graceful-fs@4.1.11: + resolution: {integrity: sha512-9x6DLUuW+ROFdMTII9ec9t/FK8va6kYcC8/LggumssLM8kNv7IdFl3VrNUqgir2tJuBVxBga1QBoRziZacO5Zg==} + engines: {node: '>=0.4.0'} + dev: true + + /graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + /grapheme-breaker@0.3.2: + resolution: {integrity: sha512-mB6rwkw1Z7z4z2RkFFTd/+q6Ug1gnCgjKAervAKgBeNI1mSr8E5EUWoYzFNOZsLHFArLfpk+O8X8qXC7uvuawQ==} + dependencies: + brfs: 1.6.1 + unicode-trie: 0.3.1 + dev: false + + /growl@1.10.3: + resolution: {integrity: sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==} + engines: {node: '>=4.x'} + dev: false + + /growly@1.3.0: + resolution: {integrity: sha512-+xGQY0YyAWCnqy7Cd++hc2JqMYzlm0dG30Jd0beaA64sROr8C4nt8Yc9V5Ro3avlSUDTN0ulqP/VBKi1/lLygw==} + dev: true + + /handle-thing@2.0.1: + resolution: {integrity: sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==} + dev: true + + /handlebars@4.7.8: + resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} + engines: {node: '>=0.4.7'} + hasBin: true + dependencies: + minimist: 1.2.8 + neo-async: 2.6.2 + source-map: 0.6.1 + wordwrap: 1.0.0 + optionalDependencies: + uglify-js: 3.17.4 + dev: true + + /har-schema@2.0.0: + resolution: {integrity: sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==} + engines: {node: '>=4'} + + /har-validator@5.1.5: + resolution: {integrity: sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==} + engines: {node: '>=6'} + deprecated: this library is no longer supported + dependencies: + ajv: 6.12.6 + har-schema: 2.0.0 + + /has-ansi@2.0.0: + resolution: {integrity: sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==} + engines: {node: '>=0.10.0'} + dependencies: + ansi-regex: 2.1.1 + + /has-bigints@1.0.2: + resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} + dev: true + + /has-flag@1.0.0: + resolution: {integrity: sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==} + engines: {node: '>=0.10.0'} + dev: true + + /has-flag@2.0.0: + resolution: {integrity: sha512-P+1n3MnwjR/Epg9BBo1KT8qbye2g2Ou4sFumihwt6I4tsUX7jnLcX4BTOSKg/B1ZrIYMN9FcEnG4x5a7NB8Eng==} + engines: {node: '>=0.10.0'} + dev: false + + /has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + + /has-property-descriptors@1.0.1: + resolution: {integrity: sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==} + dependencies: + get-intrinsic: 1.2.2 + + /has-proto@1.0.1: + resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} + engines: {node: '>= 0.4'} + + /has-symbol-support-x@1.4.2: + resolution: {integrity: sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==} + dev: false + + /has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + + /has-to-string-tag-x@1.4.1: + resolution: {integrity: sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==} + dependencies: + has-symbol-support-x: 1.4.2 + dev: false + + /has-tostringtag@1.0.0: + resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 1.0.3 + dev: true + + /has-value@0.3.1: + resolution: {integrity: sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==} + engines: {node: '>=0.10.0'} + dependencies: + get-value: 2.0.6 + has-values: 0.1.4 + isobject: 2.1.0 + + /has-value@1.0.0: + resolution: {integrity: sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==} + engines: {node: '>=0.10.0'} + dependencies: + get-value: 2.0.6 + has-values: 1.0.0 + isobject: 3.0.1 + + /has-values@0.1.4: + resolution: {integrity: sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==} + engines: {node: '>=0.10.0'} + + /has-values@1.0.0: + resolution: {integrity: sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==} + engines: {node: '>=0.10.0'} + dependencies: + is-number: 3.0.0 + kind-of: 4.0.0 + + /has@1.0.4: + resolution: {integrity: sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==} + engines: {node: '>= 0.4.0'} + + /hash-base@3.1.0: + resolution: {integrity: sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==} + engines: {node: '>=4'} + dependencies: + inherits: 2.0.4 + readable-stream: 3.6.2 + safe-buffer: 5.2.1 + + /hash.js@1.1.7: + resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} + dependencies: + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + + /hasown@2.0.0: + resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==} + engines: {node: '>= 0.4'} + dependencies: + function-bind: 1.1.2 + + /he@1.1.1: + resolution: {integrity: sha512-z/GDPjlRMNOa2XJiB4em8wJpuuBfrFOlYKTZxtpkdr1uPdibHI8rYA3MY0KDObpVyaes0e/aunid/t88ZI2EKA==} + hasBin: true + dev: false + + /he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + dev: true + + /heap@0.2.5: + resolution: {integrity: sha512-G7HLD+WKcrOyJP5VQwYZNC3Z6FcQ7YYjEFiFoIj8PfEr73mu421o8B1N5DKUcc8K37EsJ2XXWA8DtrDz/2dReg==} + dev: false + + /hmac-drbg@1.0.1: + resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==} + dependencies: + hash.js: 1.1.7 + minimalistic-assert: 1.0.1 + minimalistic-crypto-utils: 1.0.1 + + /hoist-non-react-statics@2.5.5: + resolution: {integrity: sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw==} + dev: false + + /hoist-non-react-statics@3.3.2: + resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} + dependencies: + react-is: 16.13.1 + dev: false + + /home-or-tmp@2.0.0: + resolution: {integrity: sha512-ycURW7oUxE2sNiPVw1HVEFsW+ecOpJ5zaj7eC0RlwhibhRBod20muUN8qu/gzx956YrLolVvs1MTXwKgC2rVEg==} + engines: {node: '>=0.10.0'} + dependencies: + os-homedir: 1.0.2 + os-tmpdir: 1.0.2 + dev: true + + /homedir-polyfill@1.0.3: + resolution: {integrity: sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==} + engines: {node: '>=0.10.0'} + dependencies: + parse-passwd: 1.0.0 + + /hosted-git-info@2.8.9: + resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} + + /hpack.js@2.1.6: + resolution: {integrity: sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==} + dependencies: + inherits: 2.0.4 + obuf: 1.1.2 + readable-stream: 2.3.8 + wbuf: 1.7.3 + dev: true + + /html-element-map@1.3.1: + resolution: {integrity: sha512-6XMlxrAFX4UEEGxctfFnmrFaaZFNf9i5fNuV5wZ3WWQ4FVaNP1aX1LkX9j2mfEx1NpjeE/rL3nmgEn23GdFmrg==} + dependencies: + array.prototype.filter: 1.0.3 + call-bind: 1.0.5 + dev: true + + /html-encoding-sniffer@1.0.2: + resolution: {integrity: sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==} + dependencies: + whatwg-encoding: 1.0.5 + dev: true + + /html-entities@1.4.0: + resolution: {integrity: sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA==} + dev: true + + /html-minifier-terser@5.1.1: + resolution: {integrity: sha512-ZPr5MNObqnV/T9akshPKbVgyOqLmy+Bxo7juKCfTfnjNniTAMdy4hz21YQqoofMBJD2kdREaqPPdThoR78Tgxg==} + engines: {node: '>=6'} + hasBin: true + dependencies: + camel-case: 4.1.2 + clean-css: 4.2.4 + commander: 4.1.1 + he: 1.2.0 + param-case: 3.0.4 + relateurl: 0.2.7 + terser: 4.8.1 + dev: true + + /html-webpack-plugin@4.5.2(webpack@4.46.0): + resolution: {integrity: sha512-q5oYdzjKUIPQVjOosjgvCHQOv9Ett9CYYHlgvJeXG0qQvdSojnBq4vAdQBwn1+yGveAwHCoe/rMR86ozX3+c2A==} + engines: {node: '>=6.9'} + peerDependencies: + webpack: ^4.0.0 || ^5.0.0 + dependencies: + '@types/html-minifier-terser': 5.1.2 + '@types/tapable': 1.0.12 + '@types/webpack': 4.41.38 + html-minifier-terser: 5.1.1 + loader-utils: 1.4.2 + lodash: 4.17.21 + pretty-error: 2.1.2 + tapable: 1.1.3 + util.promisify: 1.0.0 + webpack: 4.46.0(webpack-cli@3.3.12) + dev: true + + /htmlparser2@3.10.1: + resolution: {integrity: sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==} + dependencies: + domelementtype: 1.3.1 + domhandler: 2.4.2 + domutils: 1.7.0 + entities: 1.1.2 + inherits: 2.0.4 + readable-stream: 3.6.2 + dev: false + + /htmlparser2@6.1.0: + resolution: {integrity: sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==} + dependencies: + domelementtype: 2.3.0 + domhandler: 4.3.1 + domutils: 2.8.0 + entities: 2.2.0 + dev: true + + /htmlparser2@8.0.2: + resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==} + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.1.0 + entities: 4.5.0 + dev: true + + /http-cache-semantics@3.8.1: + resolution: {integrity: sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==} + dev: false + + /http-deceiver@1.2.7: + resolution: {integrity: sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==} + dev: true + + /http-errors@1.6.3: + resolution: {integrity: sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==} + engines: {node: '>= 0.6'} + dependencies: + depd: 1.1.2 + inherits: 2.0.3 + setprototypeof: 1.1.0 + statuses: 1.5.0 + dev: true + + /http-errors@2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.1 + toidentifier: 1.0.1 + dev: true + + /http-parser-js@0.5.8: + resolution: {integrity: sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==} + dev: true + + /http-proxy-middleware@0.19.1(debug@4.3.4)(supports-color@6.1.0): + resolution: {integrity: sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==} + engines: {node: '>=4.0.0'} + dependencies: + http-proxy: 1.18.1(debug@4.3.4) + is-glob: 4.0.3 + lodash: 4.17.21 + micromatch: 3.1.10(supports-color@6.1.0) + transitivePeerDependencies: + - debug + - supports-color + dev: true + + /http-proxy@1.18.1(debug@4.3.4): + resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} + engines: {node: '>=8.0.0'} + dependencies: + eventemitter3: 4.0.7 + follow-redirects: 1.15.4(debug@4.3.4) + requires-port: 1.0.0 + transitivePeerDependencies: + - debug + dev: true + + /http-signature@1.2.0: + resolution: {integrity: sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==} + engines: {node: '>=0.8', npm: '>=1.3.7'} + dependencies: + assert-plus: 1.0.0 + jsprim: 1.4.2 + sshpk: 1.18.0 + + /https-browserify@1.0.0: + resolution: {integrity: sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==} + + /https-proxy-agent@5.0.1: + resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} + engines: {node: '>= 6'} + dependencies: + agent-base: 6.0.2 + debug: 4.3.4(supports-color@6.1.0) + transitivePeerDependencies: + - supports-color + dev: true + + /hull.js@0.2.10: + resolution: {integrity: sha512-UO3W30HxhWgeSpNKCdXt00xkwjRTGmhQaoZNP8ll509Nl+DP9juXE3wRGizihuop08FSB4xtAWIbWSe+RxEoog==} + dev: false + + /humanize-url@1.0.1: + resolution: {integrity: sha512-RtgTzXCPVb/te+e82NDhAc5paj+DuKSratIGAr+v+HZK24eAQ8LMoBGYoL7N/O+9iEc33AKHg45dOMKw3DNldQ==} + engines: {node: '>=0.10.0'} + dependencies: + normalize-url: 1.9.1 + strip-url-auth: 1.0.1 + dev: true + + /hyphenate-style-name@1.0.4: + resolution: {integrity: sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ==} + dev: false + + /iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + dependencies: + safer-buffer: 2.1.2 + dev: true + + /iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + dependencies: + safer-buffer: 2.1.2 + dev: true + + /icss-replace-symbols@1.1.0: + resolution: {integrity: sha512-chIaY3Vh2mh2Q3RGXttaDIzeiPvaVXJ+C4DAh/w3c37SKZ/U6PGMmuicR2EQQp9bKG8zLMCl7I+PtIoOOPp8Gg==} + dev: false + + /icss-utils@2.1.0: + resolution: {integrity: sha512-bsVoyn/1V4R1kYYjLcWLedozAM4FClZUdjE9nIr8uWY7xs78y9DATgwz2wGU7M+7z55KenmmTkN2DVJ7bqzjAA==} + dependencies: + postcss: 6.0.23 + dev: false + + /ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + + /iferr@0.1.5: + resolution: {integrity: sha512-DUNFN5j7Tln0D+TxzloUjKB+CtVu6myn0JEFak6dG18mNt9YkQ6lzGCdafwofISZ1lLF3xRHJ98VKy9ynkcFaA==} + + /ify-loader@1.0.4: + resolution: {integrity: sha512-fzWOWwsTZH3c2GPNJy1dndN5lk+oyXGPbg9YrHv/UwC/SmlxNEUAst6evF1H9ySGbezgBA42YGLSr1WzAwgx9w==} + dependencies: + bl: 1.2.3 + findup: 0.1.5 + from2-array: 0.0.4 + map-limit: 0.0.1 + multipipe: 0.3.1 + read-package-json: 2.1.2 + resolve: 1.22.8 + dev: false + + /ignore@4.0.6: + resolution: {integrity: sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==} + engines: {node: '>= 4'} + dev: true + + /ignore@5.3.0: + resolution: {integrity: sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==} + engines: {node: '>= 4'} + + /immediate@3.0.6: + resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} + + /immutable@3.8.2: + resolution: {integrity: sha512-15gZoQ38eYjEjxkorfbcgBKBL6R7T459OuK+CpcWt7O3KF4uPCx2tD0uFETlUDIyo+1789crbMhTvQBSR5yBMg==} + engines: {node: '>=0.10.0'} + dev: false + + /import-cwd@2.1.0: + resolution: {integrity: sha512-Ew5AZzJQFqrOV5BTW3EIoHAnoie1LojZLXKcCQ/yTRyVZosBhK1x1ViYjHGf5pAFOq8ZyChZp6m/fSN7pJyZtg==} + engines: {node: '>=4'} + dependencies: + import-from: 2.1.0 + dev: false + + /import-fresh@2.0.0: + resolution: {integrity: sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg==} + engines: {node: '>=4'} + dependencies: + caller-path: 2.0.0 + resolve-from: 3.0.0 + dev: false + + /import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + dev: true + + /import-from@2.1.0: + resolution: {integrity: sha512-0vdnLL2wSGnhlRmzHJAg5JHjt1l2vYhzJ7tNLGbeVg0fse56tpGaH0uzH+r9Slej+BSXXEHvBKDEnVSLLE9/+w==} + engines: {node: '>=4'} + dependencies: + resolve-from: 3.0.0 + dev: false + + /import-local@2.0.0: + resolution: {integrity: sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==} + engines: {node: '>=6'} + hasBin: true + dependencies: + pkg-dir: 3.0.0 + resolve-cwd: 2.0.0 + + /imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + /indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + + /infer-owner@1.0.4: + resolution: {integrity: sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==} + + /inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + /inherits@2.0.3: + resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==} + + /inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + /ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + + /inquirer@0.8.5: + resolution: {integrity: sha512-+rksrtdqQ8do7yOsmP5YIgbSdbZYuCIrnfH5vjFYGAr1XgJpMksb3rFZMJ3jiKuUyDVEA4MVDYbkA3ribJn3Tg==} + dependencies: + ansi-regex: 1.1.1 + chalk: 1.1.3 + cli-width: 1.1.1 + figures: 1.7.0 + lodash: 3.10.1 + readline2: 0.1.1 + rx: 2.5.3 + through: 2.3.8 + dev: false + + /inquirer@6.5.2: + resolution: {integrity: sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==} + engines: {node: '>=6.0.0'} + dependencies: + ansi-escapes: 3.2.0 + chalk: 2.4.2 + cli-cursor: 2.1.0 + cli-width: 2.2.1 + external-editor: 3.1.0 + figures: 2.0.0 + lodash: 4.17.21 + mute-stream: 0.0.7 + run-async: 2.4.1 + rxjs: 6.6.7 + string-width: 2.1.1 + strip-ansi: 5.2.0 + through: 2.3.8 + dev: true + + /internal-ip@4.3.0: + resolution: {integrity: sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==} + engines: {node: '>=6'} + dependencies: + default-gateway: 4.2.0 + ipaddr.js: 1.9.1 + dev: true + + /internal-slot@1.0.6: + resolution: {integrity: sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.2 + hasown: 2.0.0 + side-channel: 1.0.4 + dev: true + + /interpret@1.4.0: + resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==} + engines: {node: '>= 0.10'} + + /intl-format-cache@2.2.9: + resolution: {integrity: sha512-Zv/u8wRpekckv0cLkwpVdABYST4hZNTDaX7reFetrYTJwxExR2VyTqQm+l0WmL0Qo8Mjb9Tf33qnfj0T7pjxdQ==} + dev: false + + /intl-messageformat-parser@1.4.0: + resolution: {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: false + + /intl-messageformat-parser@1.8.1: + resolution: {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: false + + /intl-messageformat@2.2.0: + resolution: {integrity: sha512-I+tSvHnXqJYjDfNmY95tpFMj30yoakC6OXAo+wu/wTMy6tA/4Fd4mvV7Uzs4cqK/Ap29sHhwjcY+78a8eifcXw==} + dependencies: + intl-messageformat-parser: 1.4.0 + dev: false + + /intl-relativeformat@2.2.0: + resolution: {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' + dependencies: + intl-messageformat: 2.2.0 + dev: false + + /intl@1.2.5: + resolution: {integrity: sha512-rK0KcPHeBFBcqsErKSpvZnrOmWOj+EmDkyJ57e90YWaQNqbcivcqmKDlHEeNprDWOsKzPsh1BfSpPQdDvclHVw==} + dev: false + + /into-stream@3.1.0: + resolution: {integrity: sha512-TcdjPibTksa1NQximqep2r17ISRiNE9fwlfbg3F8ANdvP5/yrFTew86VcO//jk4QTaMlbjypPBq76HN2zaKfZQ==} + engines: {node: '>=4'} + dependencies: + from2: 2.3.0 + p-is-promise: 1.1.0 + dev: false + + /invariant@2.2.4: + resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} + dependencies: + loose-envify: 1.4.0 + + /invert-kv@1.0.0: + resolution: {integrity: sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ==} + engines: {node: '>=0.10.0'} + + /ip-regex@2.1.0: + resolution: {integrity: sha512-58yWmlHpp7VYfcdTwMTvwMmqx/Elfxjd9RXTDyMsbL7lLWmhMylLEqiYVLKuLzOZqVgiWXD9MfR62Vv89VRxkw==} + engines: {node: '>=4'} + dev: true + + /ip-regex@4.3.0: + resolution: {integrity: sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==} + engines: {node: '>=8'} + dev: true + + /ip@1.1.8: + resolution: {integrity: sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==} + dev: true + + /ipaddr.js@1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + dev: true + + /is-absolute-url@3.0.3: + resolution: {integrity: sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==} + engines: {node: '>=8'} + dev: true + + /is-accessor-descriptor@1.0.1: + resolution: {integrity: sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA==} + engines: {node: '>= 0.10'} + dependencies: + hasown: 2.0.0 + + /is-arguments@1.1.1: + resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + has-tostringtag: 1.0.0 + dev: true + + /is-array-buffer@3.0.2: + resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} + dependencies: + call-bind: 1.0.5 + get-intrinsic: 1.2.2 + is-typed-array: 1.1.12 + dev: true + + /is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + /is-bigint@1.0.4: + resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + dependencies: + has-bigints: 1.0.2 + dev: true + + /is-binary-path@1.0.1: + resolution: {integrity: sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q==} + engines: {node: '>=0.10.0'} + dependencies: + binary-extensions: 1.13.1 + + /is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + requiresBuild: true + dependencies: + binary-extensions: 2.2.0 + optional: true + + /is-boolean-object@1.1.2: + resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + has-tostringtag: 1.0.0 + dev: true + + /is-buffer@1.1.6: + resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} + + /is-builtin-module@1.0.0: + resolution: {integrity: sha512-C2wz7Juo5pUZTFQVer9c+9b4qw3I5T/CHQxQyhVu7BJel6C22FmsLIWsdseYyOw6xz9Pqy9eJWSkQ7+3iN1HVw==} + engines: {node: '>=0.10.0'} + dependencies: + builtin-modules: 1.1.1 + dev: true + + /is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + dev: true + + /is-ci@1.2.1: + resolution: {integrity: sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==} + hasBin: true + dependencies: + ci-info: 1.6.0 + dev: true + + /is-core-module@2.13.1: + resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} + dependencies: + hasown: 2.0.0 + + /is-data-descriptor@1.0.1: + resolution: {integrity: sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw==} + engines: {node: '>= 0.4'} + dependencies: + hasown: 2.0.0 + + /is-date-object@1.0.5: + resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: true + + /is-descriptor@0.1.7: + resolution: {integrity: sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==} + engines: {node: '>= 0.4'} + dependencies: + is-accessor-descriptor: 1.0.1 + is-data-descriptor: 1.0.1 + + /is-descriptor@1.0.3: + resolution: {integrity: sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==} + engines: {node: '>= 0.4'} + dependencies: + is-accessor-descriptor: 1.0.1 + is-data-descriptor: 1.0.1 + + /is-directory@0.3.1: + resolution: {integrity: sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw==} + engines: {node: '>=0.10.0'} + dev: false + + /is-dotfile@1.0.3: + resolution: {integrity: sha512-9YclgOGtN/f8zx0Pr4FQYMdibBiTaH3sn52vjYip4ZSf6C4/6RfTEZ+MR4GvKhCxdPh21Bg42/WL55f6KSnKpg==} + engines: {node: '>=0.10.0'} + dev: true + + /is-equal-shallow@0.1.3: + resolution: {integrity: sha512-0EygVC5qPvIyb+gSz7zdD5/AAoS6Qrx1e//6N4yv4oNm30kqvdmG66oZFWVlQHUWe5OjP08FuTw2IdT0EOTcYA==} + engines: {node: '>=0.10.0'} + dependencies: + is-primitive: 2.0.0 + dev: true + + /is-extendable@0.1.1: + resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} + engines: {node: '>=0.10.0'} + + /is-extendable@1.0.1: + resolution: {integrity: sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==} + engines: {node: '>=0.10.0'} + dependencies: + is-plain-object: 2.0.4 + + /is-extglob@1.0.0: + resolution: {integrity: sha512-7Q+VbVafe6x2T+Tu6NcOf6sRklazEPmBoB3IWk3WdGZM2iGUwU/Oe3Wtq5lSEkDTTlpp8yx+5t4pzO/i9Ty1ww==} + engines: {node: '>=0.10.0'} + dev: true + + /is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + /is-finite@1.1.0: + resolution: {integrity: sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==} + engines: {node: '>=0.10.0'} + dev: true + + /is-fullwidth-code-point@1.0.0: + resolution: {integrity: sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==} + engines: {node: '>=0.10.0'} + dependencies: + number-is-nan: 1.0.1 + + /is-fullwidth-code-point@2.0.0: + resolution: {integrity: sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==} + engines: {node: '>=4'} + + /is-function@1.0.2: + resolution: {integrity: sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==} + dev: false + + /is-glob@2.0.1: + resolution: {integrity: sha512-a1dBeB19NXsf/E0+FHqkagizel/LQw2DjSQpvQrj3zT+jYPpaUCryPnrQajXKFLCMuf4I6FhRpaGtw4lPrG6Eg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 1.0.0 + dev: true + + /is-glob@3.1.0: + resolution: {integrity: sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + + /is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + + /is-in-browser@1.1.3: + resolution: {integrity: sha512-FeXIBgG/CPGd/WUxuEyvgGTEfwiG9Z4EKGxjNMRqviiIIfsmgrpnHLffEDdwUHqNva1VEW91o3xBT/m8Elgl9g==} + dev: false + + /is-natural-number@4.0.1: + resolution: {integrity: sha512-Y4LTamMe0DDQIIAlaer9eKebAlDSV6huy+TWhJVPlzZh2o4tRP5SQWFlLn5N0To4mDD22/qdOq+veo1cSISLgQ==} + dev: false + + /is-negative-zero@2.0.2: + resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} + engines: {node: '>= 0.4'} + dev: true + + /is-number-object@1.0.7: + resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: true + + /is-number@2.1.0: + resolution: {integrity: sha512-QUzH43Gfb9+5yckcrSA0VBDwEtDUchrk4F6tfJZQuNzDJbEDB9cZNzSfXGQ1jqmdDY/kl41lUOWM9syA8z8jlg==} + engines: {node: '>=0.10.0'} + dependencies: + kind-of: 3.2.2 + dev: true + + /is-number@3.0.0: + resolution: {integrity: sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==} + engines: {node: '>=0.10.0'} + dependencies: + kind-of: 3.2.2 + + /is-number@4.0.0: + resolution: {integrity: sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==} + engines: {node: '>=0.10.0'} + dev: true + + /is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + requiresBuild: true + + /is-object@1.0.2: + resolution: {integrity: sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA==} + dev: false + + /is-path-cwd@2.2.0: + resolution: {integrity: sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==} + engines: {node: '>=6'} + dev: true + + /is-path-in-cwd@2.1.0: + resolution: {integrity: sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==} + engines: {node: '>=6'} + dependencies: + is-path-inside: 2.1.0 + dev: true + + /is-path-inside@2.1.0: + resolution: {integrity: sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==} + engines: {node: '>=6'} + dependencies: + path-is-inside: 1.0.2 + dev: true + + /is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + dev: true + + /is-plain-obj@1.1.0: + resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} + engines: {node: '>=0.10.0'} + + /is-plain-object@2.0.4: + resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} + engines: {node: '>=0.10.0'} + dependencies: + isobject: 3.0.1 + + /is-posix-bracket@0.1.1: + resolution: {integrity: sha512-Yu68oeXJ7LeWNmZ3Zov/xg/oDBnBK2RNxwYY1ilNJX+tKKZqgPK+qOn/Gs9jEu66KDY9Netf5XLKNGzas/vPfQ==} + engines: {node: '>=0.10.0'} + dev: true + + /is-primitive@2.0.0: + resolution: {integrity: sha512-N3w1tFaRfk3UrPfqeRyD+GYDASU3W5VinKhlORy8EWVf/sIdDL9GAcew85XmktCfH+ngG7SRXEVDoO18WMdB/Q==} + engines: {node: '>=0.10.0'} + dev: true + + /is-regex@1.1.4: + resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + has-tostringtag: 1.0.0 + dev: true + + /is-retry-allowed@1.2.0: + resolution: {integrity: sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==} + engines: {node: '>=0.10.0'} + dev: false + + /is-shared-array-buffer@1.0.2: + resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} + dependencies: + call-bind: 1.0.5 + dev: true + + /is-stream@1.1.0: + resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} + engines: {node: '>=0.10.0'} + + /is-string@1.0.7: + resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: true + + /is-subset@0.1.1: + resolution: {integrity: sha512-6Ybun0IkarhmEqxXCNw/C0bna6Zb/TkfUX9UbwJtK6ObwAVCxmAP308WWTHviM/zAqXk05cdhYsUsZeGQh99iw==} + dev: true + + /is-symbol@1.0.4: + resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 1.0.3 + dev: true + + /is-typed-array@1.1.12: + resolution: {integrity: sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==} + engines: {node: '>= 0.4'} + dependencies: + which-typed-array: 1.1.13 + dev: true + + /is-typedarray@1.0.0: + resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} + + /is-url@1.2.4: + resolution: {integrity: sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==} + dev: true + + /is-utf8@0.2.1: + resolution: {integrity: sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==} + dev: true + + /is-weakref@1.0.2: + resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + dependencies: + call-bind: 1.0.5 + dev: true + + /is-windows@1.0.2: + resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} + engines: {node: '>=0.10.0'} + + /is-wsl@1.1.0: + resolution: {integrity: sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==} + engines: {node: '>=4'} + + /is2@2.0.9: + resolution: {integrity: sha512-rZkHeBn9Zzq52sd9IUIV3a5mfwBY+o2HePMh0wkGBM4z4qjvy2GwVxQ6nNXSfw6MmVP6gf1QIlWjiOavhM3x5g==} + engines: {node: '>=v0.10.0'} + dependencies: + deep-is: 0.1.4 + ip-regex: 4.3.0 + is-url: 1.2.4 + dev: true + + /isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + + /isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + + /isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + /isobject@2.1.0: + resolution: {integrity: sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==} + engines: {node: '>=0.10.0'} + dependencies: + isarray: 1.0.0 + + /isobject@3.0.1: + resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} + engines: {node: '>=0.10.0'} + + /isomorphic-fetch@2.2.1: + resolution: {integrity: sha512-9c4TNAKYXM5PRyVcwUZrF3W09nQ+sO7+jydgs4ZGW9dhsLG2VOlISJABombdQqQRXCwuYG3sYV/puGf5rp0qmA==} + dependencies: + node-fetch: 1.7.3 + whatwg-fetch: 3.6.20 + dev: true + + /isstream@0.1.2: + resolution: {integrity: sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==} + + /istanbul-api@1.3.7: + resolution: {integrity: sha512-4/ApBnMVeEPG3EkSzcw25wDe4N66wxwn+KKn6b47vyek8Xb3NBAcg4xfuQbS7BqcZuTX4wxfD5lVagdggR3gyA==} + dependencies: + async: 2.6.4 + fileset: 2.0.3 + 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.14.1 + mkdirp: 0.5.6 + once: 1.4.0 + transitivePeerDependencies: + - supports-color + dev: true + + /istanbul-lib-coverage@1.2.1: + resolution: {integrity: sha512-PzITeunAgyGbtY1ibVIUiV679EFChHjoMNRibEIobvmrCRaIgwLxNucOSimtNWUhEib/oO7QY2imD75JVgCJWQ==} + dev: true + + /istanbul-lib-hook@1.2.2: + resolution: {integrity: sha512-/Jmq7Y1VeHnZEQ3TL10VHyb564mn6VrQXHchON9Jf/AEcmQ3ZIiyD1BVzNOKTZf/G3gE+kiGK6SmpF9y3qGPLw==} + dependencies: + append-transform: 0.4.0 + dev: true + + /istanbul-lib-instrument@1.10.2: + resolution: {integrity: sha512-aWHxfxDqvh/ZlxR8BBaEPVSWDPUkGD63VjGQn3jcw8jCp7sHEMKcrj4xfJn/ABzdMEHiQNyvDQhqm5o8+SQg7A==} + dependencies: + babel-generator: 6.26.1 + babel-template: 6.26.0 + babel-traverse: 6.26.0 + babel-types: 6.26.0 + babylon: 6.18.0 + istanbul-lib-coverage: 1.2.1 + semver: 5.7.2 + transitivePeerDependencies: + - supports-color + dev: true + + /istanbul-lib-report@1.1.5: + resolution: {integrity: sha512-UsYfRMoi6QO/doUshYNqcKJqVmFe9w51GZz8BS3WB0lYxAllQYklka2wP9+dGZeHYaWIdcXUx8JGdbqaoXRXzw==} + dependencies: + istanbul-lib-coverage: 1.2.1 + mkdirp: 0.5.6 + path-parse: 1.0.7 + supports-color: 3.2.3 + dev: true + + /istanbul-lib-source-maps@1.2.6: + resolution: {integrity: sha512-TtbsY5GIHgbMsMiRw35YBHGpZ1DVFEO19vxxeiDMYaeOFOCzfnYVxvl6pOUIZR4dtPhAGpSMup8OyF8ubsaqEg==} + dependencies: + debug: 3.2.7(supports-color@6.1.0) + istanbul-lib-coverage: 1.2.1 + mkdirp: 0.5.6 + rimraf: 2.7.1 + source-map: 0.5.7 + transitivePeerDependencies: + - supports-color + dev: true + + /istanbul-reports@1.5.1: + resolution: {integrity: sha512-+cfoZ0UXzWjhAdzosCPP3AN8vvef8XDkWtTfgaN+7L3YTpNYITnCaEkceo5SEYy644VkHka/P1FvkWvrG/rrJw==} + dependencies: + handlebars: 4.7.8 + dev: true + + /isurl@1.0.0: + resolution: {integrity: sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==} + engines: {node: '>= 4'} + dependencies: + has-to-string-tag-x: 1.4.1 + is-object: 1.0.2 + dev: false + + /javascript-natural-sort@0.7.1: + resolution: {integrity: sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw==} + dev: false + + /jest-changed-files@21.2.0: + resolution: {integrity: sha512-+lCNP1IZLwN1NOIvBcV5zEL6GENK6TXrDj4UxWIeLvIsIDa+gf6J7hkqsW2qVVt/wvH65rVvcPwqXdps5eclTQ==} + dependencies: + throat: 4.1.0 + dev: true + + /jest-cli@21.2.1: + resolution: {integrity: sha512-T1BzrbFxDIW/LLYQqVfo94y/hhaj1NzVQkZgBumAC+sxbjMROI7VkihOdxNR758iYbQykL2ZOWUBurFgkQrzdg==} + engines: {node: '>= 4'} + hasBin: true + dependencies: + ansi-escapes: 3.2.0 + chalk: 2.4.2 + glob: 7.2.3 + graceful-fs: 4.2.11 + is-ci: 1.2.1 + istanbul-api: 1.3.7 + istanbul-lib-coverage: 1.2.1 + istanbul-lib-instrument: 1.10.2 + istanbul-lib-source-maps: 1.2.6 + 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.4.5 + pify: 3.0.0 + slash: 1.0.0 + string-length: 2.0.0 + strip-ansi: 4.0.0 + which: 1.3.1 + worker-farm: 1.7.0 + yargs: 9.0.1 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-config@21.2.1: + resolution: {integrity: sha512-fJru5HtlD/5l2o25eY9xT0doK3t2dlglrqoGpbktduyoI0T5CwuB++2YfoNZCrgZipTwPuAGonYv0q7+8yDc/A==} + dependencies: + chalk: 2.4.2 + glob: 7.2.3 + 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 + dev: true + + /jest-diff@21.2.1: + resolution: {integrity: sha512-E5fu6r7PvvPr5qAWE1RaUwIh/k6Zx/3OOkZ4rk5dBJkEWRrUuSgbMt2EO8IUTPTd6DOqU3LW6uTIwX5FRvXoFA==} + dependencies: + chalk: 2.4.2 + diff: 3.5.0 + jest-get-type: 21.2.0 + pretty-format: 21.2.1 + dev: true + + /jest-docblock@21.2.0: + resolution: {integrity: sha512-5IZ7sY9dBAYSV+YjQ0Ovb540Ku7AO9Z5o2Cg789xj167iQuZ2cG+z0f3Uct6WeYLbU6aQiM2pCs7sZ+4dotydw==} + dev: true + + /jest-environment-jsdom@21.2.1: + resolution: {integrity: sha512-mecaeNh0eWmzNrUNMWARysc0E9R96UPBamNiOCYL28k7mksb1d0q6DD38WKP7ABffjnXyUWJPVaWRgUOivwXwg==} + dependencies: + jest-mock: 21.2.0 + jest-util: 21.2.1 + jsdom: 9.12.0 + dev: true + + /jest-environment-node@21.2.1: + resolution: {integrity: sha512-R211867wx9mVBVHzrjGRGTy5cd05K7eqzQl/WyZixR/VkJ4FayS8qkKXZyYnwZi6Rxo6WEV81cDbiUx/GfuLNw==} + dependencies: + jest-mock: 21.2.0 + jest-util: 21.2.1 + dev: true + + /jest-get-type@21.2.0: + resolution: {integrity: sha512-y2fFw3C+D0yjNSDp7ab1kcd6NUYfy3waPTlD8yWkAtiocJdBRQqNoRqVfMNxgj+IjT0V5cBIHJO0z9vuSSZ43Q==} + dev: true + + /jest-get-type@24.9.0: + resolution: {integrity: sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q==} + engines: {node: '>= 6'} + dev: true + + /jest-haste-map@21.2.0: + resolution: {integrity: sha512-5LhsY/loPH7wwOFRMs+PT4aIAORJ2qwgbpMFlbWbxfN0bk3ZCwxJ530vrbSiTstMkYLao6JwBkLhCJ5XbY7ZHw==} + dependencies: + fb-watchman: 2.0.2 + graceful-fs: 4.2.11 + jest-docblock: 21.2.0 + micromatch: 2.3.11 + sane: 2.5.2 + worker-farm: 1.7.0 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-jasmine2@21.2.1: + resolution: {integrity: sha512-lw8FXXIEekD+jYNlStfgNsUHpfMWhWWCgHV7n0B7mA/vendH7vBFs8xybjQsDzJSduptBZJHqQX9SMssya9+3A==} + dependencies: + chalk: 2.4.2 + expect: 21.2.1 + graceful-fs: 4.2.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 + dev: true + + /jest-junit@7.0.0: + resolution: {integrity: sha512-ljUdO0hLyu0A92xk7R2Wet3kj99fmazTo+ZFYQP6b7AGOBxJUj8ZkJWzJ632ajpXko2Y5oNoGR2kvOwiDdu6hg==} + engines: {node: '>=6.0.0'} + dependencies: + jest-validate: 24.9.0 + mkdirp: 0.5.6 + strip-ansi: 4.0.0 + xml: 1.0.1 + dev: true + + /jest-matcher-utils@21.2.1: + resolution: {integrity: sha512-kn56My+sekD43dwQPrXBl9Zn9tAqwoy25xxe7/iY4u+mG8P3ALj5IK7MLHZ4Mi3xW7uWVCjGY8cm4PqgbsqMCg==} + dependencies: + chalk: 2.4.2 + jest-get-type: 21.2.0 + pretty-format: 21.2.1 + dev: true + + /jest-message-util@21.2.1: + resolution: {integrity: sha512-EbC1X2n0t9IdeMECJn2BOg7buOGivCvVNjqKMXTzQOu7uIfLml+keUfCALDh8o4rbtndIeyGU8/BKfoTr/LVDQ==} + dependencies: + chalk: 2.4.2 + micromatch: 2.3.11 + slash: 1.0.0 + dev: true + + /jest-mock@21.2.0: + resolution: {integrity: sha512-aZDfyVf0LEoABWiY6N0d+O963dUQSyUa4qgzurHR3TBDPen0YxKCJ6l2i7lQGh1tVdsuvdrCZ4qPj+A7PievCw==} + dev: true + + /jest-regex-util@21.2.0: + resolution: {integrity: sha512-BKQ1F83EQy0d9Jen/mcVX7D+lUt2tthhK/2gDWRgLDJRNOdRgSp1iVqFxP8EN1ARuypvDflRfPzYT8fQnoBQFQ==} + dev: true + + /jest-resolve-dependencies@21.2.0: + resolution: {integrity: sha512-ok8ybRFU5ScaAcfufIQrCbdNJSRZ85mkxJ1EhUp8Bhav1W1/jv/rl1Q6QoVQHObNxmKnbHVKrfLZbCbOsXQ+bQ==} + dependencies: + jest-regex-util: 21.2.0 + dev: true + + /jest-resolve@21.2.0: + resolution: {integrity: sha512-vefQ/Lr+VdNvHUZFQXWtOqHX3HEdOc2MtSahBO89qXywEbUxGPB9ZLP9+BHinkxb60UT2Q/tTDOS6rYc6Mwigw==} + dependencies: + browser-resolve: 1.11.3 + chalk: 2.4.2 + is-builtin-module: 1.0.0 + dev: true + + /jest-runner@21.2.1: + resolution: {integrity: sha512-Anb72BOQlHqF/zETqZ2K20dbYsnqW/nZO7jV8BYENl+3c44JhMrA8zd1lt52+N7ErnsQMd2HHKiVwN9GYSXmrg==} + 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.1.0 + worker-farm: 1.7.0 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-runtime@21.2.1: + resolution: {integrity: sha512-6omlpA3+NSE+rHwD0PQjNEjZeb2z+oRmuehMfM1tWQVum+E0WV3pFt26Am0DUfQkkPyTABvxITRjCUclYgSOsA==} + hasBin: true + dependencies: + babel-core: 6.26.3 + babel-jest: 21.2.0(babel-core@6.26.3) + babel-plugin-istanbul: 4.1.6 + chalk: 2.4.2 + convert-source-map: 1.9.0 + graceful-fs: 4.2.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.1.0 + micromatch: 2.3.11 + slash: 1.0.0 + strip-bom: 3.0.0 + write-file-atomic: 2.4.3 + yargs: 9.0.1 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-snapshot@21.2.1: + resolution: {integrity: sha512-bpaeBnDpdqaRTzN8tWg0DqOTo2DvD3StOemxn67CUd1p1Po+BUpvePAp44jdJ7Pxcjfg+42o4NHw1SxdCA2rvg==} + dependencies: + chalk: 2.4.2 + jest-diff: 21.2.1 + jest-matcher-utils: 21.2.1 + mkdirp: 0.5.6 + natural-compare: 1.4.0 + pretty-format: 21.2.1 + dev: true + + /jest-util@21.2.1: + resolution: {integrity: sha512-r20W91rmHY3fnCoO7aOAlyfC51x2yeV3xF+prGsJAUsYhKeV670ZB8NO88Lwm7ASu8SdH0S+U+eFf498kjhA4g==} + dependencies: + callsites: 2.0.0 + chalk: 2.4.2 + graceful-fs: 4.2.11 + jest-message-util: 21.2.1 + jest-mock: 21.2.0 + jest-validate: 21.2.1 + mkdirp: 0.5.6 + dev: true + + /jest-validate@21.2.1: + resolution: {integrity: sha512-k4HLI1rZQjlU+EC682RlQ6oZvLrE5SCh3brseQc24vbZTxzT/k/3urar5QMCVgjadmSO7lECeGdc6YxnM3yEGg==} + dependencies: + chalk: 2.4.2 + jest-get-type: 21.2.0 + leven: 2.1.0 + pretty-format: 21.2.1 + dev: true + + /jest-validate@24.9.0: + resolution: {integrity: sha512-HPIt6C5ACwiqSiwi+OfSSHbK8sG7akG8eATl+IPKaeIjtPOeBUd/g3J7DghugzxrGjI93qS/+RPKe1H6PqvhRQ==} + engines: {node: '>= 6'} + dependencies: + '@jest/types': 24.9.0 + camelcase: 5.3.1 + chalk: 2.4.2 + jest-get-type: 24.9.0 + leven: 3.1.0 + pretty-format: 24.9.0 + dev: true + + /jest@21.2.1: + resolution: {integrity: sha512-mXN0ppPvWYoIcC+R+ctKxAJ28xkt/Z5Js875padm4GbgUn6baeR5N4Ng6LjatIRpUQDZVJABT7Y4gucFjPryfw==} + engines: {node: '>= 4'} + hasBin: true + dependencies: + jest-cli: 21.2.1 + transitivePeerDependencies: + - supports-color + dev: true + + /js-base64@2.4.9: + resolution: {integrity: sha512-xcinL3AuDJk7VSzsHgb9DvvIXayBbadtMZ4HFPx8rUszbW1MuNMlwYVC4zzCZ6e1sqZpnNS5ZFYOhXqA39T7LQ==} + dev: false + + /js-md5@0.7.3: + resolution: {integrity: sha512-ZC41vPSTLKGwIRjqDh8DfXoCrdQIyBgspJVPXHBGu4nZlAEvG3nf+jO9avM9RmLiGakg7vz974ms99nEV0tmTQ==} + dev: false + + /js-tokens@3.0.2: + resolution: {integrity: sha512-RjTcuD4xjtthQkaWH7dFlH85L+QaVtSoOyGdZ3g6HFhS9dFNDfLyqgm2NFe2X6cQpeFmt0452FJjFG5UameExg==} + + /js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + /js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + + /jsbn@0.1.1: + resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==} + + /jsdom@9.12.0: + resolution: {integrity: sha512-Qw4oqNxo4LyzkSqVIyCnEltTc4xV3g1GBaI88AvYTesWzmWHUSoMNmhBjUBa+6ldXIBJS9xoeLNJPfUAykTyxw==} + dependencies: + abab: 1.0.4 + acorn: 4.0.13 + acorn-globals: 3.1.0 + array-equal: 1.0.2 + content-type-parser: 1.0.2 + cssom: 0.3.8 + cssstyle: 0.2.37 + escodegen: 1.14.3 + html-encoding-sniffer: 1.0.2 + nwmatcher: 1.4.4 + parse5: 1.5.1 + request: 2.88.2 + sax: 1.3.0 + symbol-tree: 3.2.4 + tough-cookie: 2.5.0 + webidl-conversions: 4.0.2 + whatwg-encoding: 1.0.5 + whatwg-url: 4.8.0 + xml-name-validator: 2.0.1 + dev: true + + /jsesc@0.5.0: + resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} + hasBin: true + dev: true + + /jsesc@1.3.0: + resolution: {integrity: sha512-Mke0DA0QjUWuJlhsE0ZPPhYiJkRap642SmI/4ztCFaUs6V2AiH1sfecc+57NgaryfAA2VR3v6O+CSjC1jZJKOA==} + hasBin: true + dev: true + + /jsesc@2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true + + /json-buffer@3.0.0: + resolution: {integrity: sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==} + dev: false + + /json-parse-better-errors@1.0.2: + resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} + + /json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + dev: false + + /json-schema-traverse@0.3.1: + resolution: {integrity: sha512-4JD/Ivzg7PoW8NzdrBSr3UFwC9mHgvI7Z6z3QGBsSHgKaRTUDmyZAAKJo2UbG1kUVfS9WS8bi36N49U1xw43DA==} + dev: false + + /json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + /json-schema@0.4.0: + resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} + + /json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + dev: true + + /json-stable-stringify@1.1.0: + resolution: {integrity: sha512-zfA+5SuwYN2VWqN1/5HZaDzQKLJHaBVMZIIM+wuYjdptkaQsqzDdqjqf+lZZJUuJq1aanHiY8LhH8LmH+qBYJA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + isarray: 2.0.5 + jsonify: 0.0.1 + object-keys: 1.1.1 + dev: true + + /json-stringify-safe@5.0.1: + resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + + /json5@0.5.1: + resolution: {integrity: sha512-4xrs1aW+6N5DalkqSVA8fxh458CXvR99WU8WLKmq4v8eWAL86Xo3BVqyd3SkA9wEVjCMqyvvRRkshAdOnBp5rw==} + hasBin: true + dev: true + + /json5@1.0.2: + resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} + hasBin: true + dependencies: + minimist: 1.2.8 + + /json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + /jsonfile@4.0.0: + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + optionalDependencies: + graceful-fs: 4.2.11 + + /jsonify@0.0.1: + resolution: {integrity: sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==} + dev: true + + /jsprim@1.4.2: + resolution: {integrity: sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==} + engines: {node: '>=0.6.0'} + dependencies: + assert-plus: 1.0.0 + extsprintf: 1.3.0 + json-schema: 0.4.0 + verror: 1.10.0 + + /jsx-ast-utils@3.3.5: + resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} + engines: {node: '>=4.0'} + dependencies: + array-includes: 3.1.7 + array.prototype.flat: 1.3.2 + object.assign: 4.1.5 + object.values: 1.1.7 + dev: true + + /jszip@3.1.5: + resolution: {integrity: sha512-5W8NUaFRFRqTOL7ZDDrx5qWHJyBXy6velVudIzQUSoqAAYqzSh2Z7/m0Rf1QbmQJccegD0r+YZxBjzqoBiEeJQ==} + dependencies: + core-js: 2.3.0 + es6-promise: 3.0.2 + lie: 3.1.1 + pako: 1.0.11 + readable-stream: 2.0.6 + dev: false + + /jszip@3.10.1: + resolution: {integrity: sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==} + dependencies: + lie: 3.3.0 + pako: 1.0.11 + readable-stream: 2.3.8 + setimmediate: 1.0.5 + + /keymirror@0.1.1: + resolution: {integrity: sha512-vIkZAFWoDijgQT/Nvl2AHCMmnegN2ehgTPYuyy2hWQkQSntI0S7ESYqdLkoSe1HyEBFHHkCgSIvVdSEiWwKvCg==} + dev: false + + /keyv@3.0.0: + resolution: {integrity: sha512-eguHnq22OE3uVoSYG0LVWNP+4ppamWr9+zWBe1bsNcovIMy6huUJFPgy4mGwCd/rnl3vOLGW1MTlu4c57CT1xA==} + dependencies: + json-buffer: 3.0.0 + dev: false + + /killable@1.0.1: + resolution: {integrity: sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==} + dev: true + + /kind-of@3.2.2: + resolution: {integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==} + engines: {node: '>=0.10.0'} + dependencies: + is-buffer: 1.1.6 + + /kind-of@4.0.0: + resolution: {integrity: sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==} + engines: {node: '>=0.10.0'} + dependencies: + is-buffer: 1.1.6 + + /kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + + /lcid@1.0.0: + resolution: {integrity: sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw==} + engines: {node: '>=0.10.0'} + dependencies: + invert-kv: 1.0.0 + + /leven@2.1.0: + resolution: {integrity: sha512-nvVPLpIHUxCUoRLrFqTgSxXJ614d8AgQoWl7zPe/2VadE8+1dpU3LBhowRuBAcuwruWtOdD8oYC9jDNJjXDPyA==} + engines: {node: '>=0.10.0'} + dev: true + + /leven@3.1.0: + resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} + engines: {node: '>=6'} + dev: true + + /levn@0.3.0: + resolution: {integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.1.2 + type-check: 0.3.2 + + /lie@3.1.1: + resolution: {integrity: sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw==} + dependencies: + immediate: 3.0.6 + dev: false + + /lie@3.3.0: + resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} + dependencies: + immediate: 3.0.6 + + /linebreak@0.3.0: + resolution: {integrity: sha512-zt8pzlM3oq4moDN8U5mP1SbZ44yKV6dXCu44Ez6iTXmxUl8/jRFWeho2SDqL5YDBv0TBKPgU/XGovZwnXAKlOQ==} + dependencies: + base64-js: 0.0.8 + brfs: 1.6.1 + unicode-trie: 0.3.1 + dev: false + + /load-json-file@1.1.0: + resolution: {integrity: sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==} + engines: {node: '>=0.10.0'} + dependencies: + graceful-fs: 4.2.11 + parse-json: 2.2.0 + pify: 2.3.0 + pinkie-promise: 2.0.1 + strip-bom: 2.0.0 + dev: true + + /load-json-file@2.0.0: + resolution: {integrity: sha512-3p6ZOGNbiX4CdvEd1VcE6yi78UrGNpjHO33noGwHCnT/o2fyllJDepsm8+mFFv/DvtwFHht5HIHSyOy5a+ChVQ==} + engines: {node: '>=4'} + dependencies: + graceful-fs: 4.2.11 + parse-json: 2.2.0 + pify: 2.3.0 + strip-bom: 3.0.0 + dev: true + + /load-json-file@4.0.0: + resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==} + engines: {node: '>=4'} + dependencies: + graceful-fs: 4.2.11 + parse-json: 4.0.0 + pify: 3.0.0 + strip-bom: 3.0.0 + dev: true + + /loader-runner@2.4.0: + resolution: {integrity: sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==} + engines: {node: '>=4.3.0 <5.0.0 || >=5.10'} + + /loader-utils@1.4.2: + resolution: {integrity: sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==} + engines: {node: '>=4.0.0'} + dependencies: + big.js: 5.2.2 + emojis-list: 3.0.0 + json5: 1.0.2 + + /loader-utils@2.0.4: + resolution: {integrity: sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==} + engines: {node: '>=8.9.0'} + dependencies: + big.js: 5.2.2 + emojis-list: 3.0.0 + json5: 2.2.3 + + /localforage@1.10.0: + resolution: {integrity: sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg==} + dependencies: + lie: 3.1.1 + dev: false + + /locate-path@2.0.0: + resolution: {integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==} + engines: {node: '>=4'} + dependencies: + p-locate: 2.0.0 + path-exists: 3.0.0 + dev: true + + /locate-path@3.0.0: + resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} + engines: {node: '>=6'} + dependencies: + p-locate: 3.0.0 + path-exists: 3.0.0 + + /locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + dependencies: + p-locate: 4.1.0 + + /lodash-es@4.17.21: + resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + dev: false + + /lodash._getnative@3.9.1: + resolution: {integrity: sha512-RrL9VxMEPyDMHOd9uFbvMe8X55X16/cGM5IgOKgRElQZutpX89iS6vwl64duTV1/16w5JY7tuFNXqoekmh1EmA==} + dev: false + + /lodash.bindall@4.4.0: + resolution: {integrity: sha512-NQ+QvFohS2gPbWpyLfyuiF0ZQA3TTaJ+n0XDID5jwtMZBKE32gN5vSyy7xBVsqvJkvT/UY9dvHXIk9tZmBVF3g==} + dev: false + + /lodash.debounce@3.1.1: + resolution: {integrity: sha512-lcmJwMpdPAtChA4hfiwxTtgFeNAaow701wWUgVUqeD0XJF7vMXIN+bu/2FJSGxT0NUbZy9g9VFrlOFfPjl+0Ew==} + dependencies: + lodash._getnative: 3.9.1 + dev: false + + /lodash.debounce@4.0.8: + resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + + /lodash.defaultsdeep@4.6.1: + resolution: {integrity: sha512-3j8wdDzYuWO3lM3Reg03MuQR957t287Rpcxp1njpEa8oDrikb+FwGdW3n+FELh/A6qib6yPit0j/pv9G/yeAqA==} + dev: true + + /lodash.escape@4.0.1: + resolution: {integrity: sha512-nXEOnb/jK9g0DYMr1/Xvq6l5xMD7GDG55+GSYIYmS0G4tBk/hURD4JR9WCavs04t33WmJx9kCyp9vJ+mr4BOUw==} + dev: true + + /lodash.flattendeep@4.4.0: + resolution: {integrity: sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==} + dev: true + + /lodash.isequal@4.5.0: + resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} + dev: true + + /lodash.isplainobject@4.0.6: + resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} + dev: true + + /lodash.omit@4.5.0: + resolution: {integrity: sha512-XeqSp49hNGmlkj2EJlfrQFIzQ6lXdNro9sddtQzcJY8QaoC2GO0DT7xaIokHeyM+mIT0mPMlPvkYzg2xCuHdZg==} + dev: false + + /lodash.throttle@3.0.4: + resolution: {integrity: sha512-dRU/xiF4W8a521NYnQosG5drDqv4+hp3ND6yWNJUMnwO1E87Q/A7oc9M/g6pk29K9U3j/ZWhM3BAQZyr/P6TTQ==} + dependencies: + lodash.debounce: 3.1.1 + dev: false + + /lodash.throttle@4.0.1: + resolution: {integrity: sha512-vEeVrketgBFJ268V478NKyLk142uvnlFHuRHUUcu5NhsMQQpTs5EIGZduGNqdJOOhnb+Rwkz0XvfQuwOYzRo1Q==} + dependencies: + lodash.debounce: 4.0.8 + dev: false + + /lodash.unescape@4.0.1: + resolution: {integrity: sha512-DhhGRshNS1aX6s5YdBE3njCCouPgnG29ebyHvImlZzXZf2SHgt+J08DHgytTPnpywNbO1Y8mNUFyQuIDBq2JZg==} + dev: true + + /lodash@3.10.1: + resolution: {integrity: sha512-9mDDwqVIma6OZX79ZlDACZl8sBm0TEnkf99zV3iMA4GzkIT/9hiqP5mY0HoT1iNLCrKc/R1HByV+yJfRWVJryQ==} + dev: false + + /lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + /loglevel@1.8.1: + resolution: {integrity: sha512-tCRIJM51SHjAayKwC+QAg8hT8vg6z7GSgLJKGvzuPb1Wc+hLzqtuVLxp6/HzSPOozuK+8ErAhy7U/sVzw8Dgfg==} + engines: {node: '>= 0.6.0'} + dev: true + + /lookup-closest-locale@6.2.0: + resolution: {integrity: sha512-/c2kL+Vnp1jnV6K6RpDTHK3dgg0Tu2VVp+elEiJpjfS1UyY7AjOYHohRug6wT0OpoX2qFgNORndE9RqesfVxWQ==} + dev: false + + /loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + dependencies: + js-tokens: 4.0.0 + + /lower-case@2.0.2: + resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} + dependencies: + tslib: 2.6.2 + dev: true + + /lowercase-keys@1.0.0: + resolution: {integrity: sha512-RPlX0+PHuvxVDZ7xX+EBVAp4RsVxP/TdDSN2mJYdiq1Lc4Hz7EUSjUI7RZrKKlmrIzVhf6Jo2stj7++gVarS0A==} + engines: {node: '>=0.10.0'} + dev: false + + /lowercase-keys@1.0.1: + resolution: {integrity: sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==} + engines: {node: '>=0.10.0'} + dev: false + + /lru-cache@4.1.5: + resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} + dependencies: + pseudomap: 1.0.2 + yallist: 2.1.2 + dev: true + + /lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + dependencies: + yallist: 3.1.1 + + /lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + dependencies: + yallist: 4.0.0 + dev: false + + /lz-string@1.5.0: + resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} + hasBin: true + dev: false + + /magic-string@0.22.5: + resolution: {integrity: sha512-oreip9rJZkzvA8Qzk9HFs8fZGF/u7H/gtrE8EN6RjKJ9kh2HlC+yQ2QezifqTZfGyiuAV0dRv5a+y/8gBb1m9w==} + dependencies: + vlq: 0.2.3 + dev: false + + /make-dir@1.3.0: + resolution: {integrity: sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==} + engines: {node: '>=4'} + dependencies: + pify: 3.0.0 + + /make-dir@2.1.0: + resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} + engines: {node: '>=6'} + dependencies: + pify: 4.0.1 + semver: 5.7.2 + + /make-dir@3.1.0: + resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} + engines: {node: '>=8'} + dependencies: + semver: 6.3.1 + + /makeerror@1.0.12: + resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} + dependencies: + tmpl: 1.0.5 + dev: true + + /map-cache@0.2.2: + resolution: {integrity: sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==} + engines: {node: '>=0.10.0'} + + /map-limit@0.0.1: + resolution: {integrity: sha512-pJpcfLPnIF/Sk3taPW21G/RQsEEirGaFpCW3oXRwH9dnFHPHNGjNyvh++rdmC2fNqEaTw2MhYJraoJWAHx8kEg==} + dependencies: + once: 1.3.3 + dev: false + + /map-visit@1.0.0: + resolution: {integrity: sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==} + engines: {node: '>=0.10.0'} + dependencies: + object-visit: 1.0.1 + + /matchmediaquery@0.2.1: + resolution: {integrity: sha512-9Ssn6kNVoYU970FtX6jS74GAyKc2baQaoifG1X/i6tfqLQgf3aM4ovYYBVWVOk4G14odceUarbwgSjDTLL/Dhw==} + dependencies: + css-mediaquery: 0.1.2 + dev: false + + /math-random@1.0.4: + resolution: {integrity: sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==} + dev: true + + /mathjs@11.12.0: + resolution: {integrity: sha512-UGhVw8rS1AyedyI55DGz9q1qZ0p98kyKPyc9vherBkoueLntPfKtPBh14x+V4cdUWK0NZV2TBwqRFlvadscSuw==} + engines: {node: '>= 14'} + hasBin: true + dependencies: + '@babel/runtime': 7.23.7 + complex.js: 2.1.1 + decimal.js: 10.4.3 + escape-latex: 1.2.0 + fraction.js: 4.3.4 + javascript-natural-sort: 0.7.1 + seedrandom: 3.0.5 + tiny-emitter: 2.1.0 + typed-function: 4.1.1 + dev: false + + /md5.js@1.3.5: + resolution: {integrity: sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==} + dependencies: + hash-base: 3.1.0 + inherits: 2.0.4 + safe-buffer: 5.2.1 + + /mdn-data@2.0.14: + resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==} + dev: false + + /media-typer@0.3.0: + resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} + engines: {node: '>= 0.6'} + dev: true + + /mem@1.1.0: + resolution: {integrity: sha512-nOBDrc/wgpkd3X/JOhMqYR+/eLqlfLP4oQfoBA6QExIxEl+GU01oyEkwWyueyO8110pUKijtiHGhEmYoOn88oQ==} + engines: {node: '>=4'} + dependencies: + mimic-fn: 1.2.0 + dev: true + + /memory-fs@0.2.0: + resolution: {integrity: sha512-+y4mDxU4rvXXu5UDSGCGNiesFmwCHuefGMoPCO1WYucNYj7DsLqrFaa2fXVI0H+NNiPTwwzKwspn9yTZqUGqng==} + dev: true + + /memory-fs@0.4.1: + resolution: {integrity: sha512-cda4JKCxReDXFXRqOHPQscuIYg1PvxbE2S2GP45rnwfEK+vZaXC8C1OFvdHIbgw0DLzowXGVoxLaAmlgRy14GQ==} + dependencies: + errno: 0.1.8 + readable-stream: 2.3.8 + + /memory-fs@0.5.0: + resolution: {integrity: sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==} + engines: {node: '>=4.3.0 <5.0.0 || >=5.10'} + dependencies: + errno: 0.1.8 + readable-stream: 2.3.8 + + /merge-descriptors@1.0.1: + resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} + dev: true + + /merge-source-map@1.0.4: + resolution: {integrity: sha512-PGSmS0kfnTnMJCzJ16BLLCEe6oeYCamKFFdQKshi4BmM6FUwipjVOcBFGxqtQtirtAG4iZvHlqST9CpZKqlRjA==} + dependencies: + source-map: 0.5.7 + dev: false + + /merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + /merge@1.2.1: + resolution: {integrity: sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ==} + dev: true + + /mersenne-twister@1.1.0: + resolution: {integrity: sha512-mUYWsMKNrm4lfygPkL3OfGzOPTR2DBlTkBNHM//F6hGp8cLThY897crAlk3/Jo17LEOOjQUrNAx6DvgO77QJkA==} + dev: false + + /methods@1.1.2: + resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} + engines: {node: '>= 0.6'} + dev: true + + /microee@0.0.6: + resolution: {integrity: sha512-/LdL3jiBWDJ3oQIRLgRhfeCZNE3patM1LiwCC124+/HHn10sI/G2OAyiMfTNzH5oYWoZBk0tRZADAUOv+0Wt0A==} + dev: false + + /micromatch@2.3.11: + resolution: {integrity: sha512-LnU2XFEk9xxSJ6rfgAry/ty5qwUTyHYOBU0g4R6tIw5ljwgGIBmiKhRWLw5NpMOnrgUNcDJ4WMp8rl3sYVHLNA==} + engines: {node: '>=0.10.0'} + dependencies: + arr-diff: 2.0.0 + array-unique: 0.2.1 + braces: 1.8.5 + expand-brackets: 0.1.5 + extglob: 0.3.2 + filename-regex: 2.0.1 + is-extglob: 1.0.0 + is-glob: 2.0.1 + kind-of: 3.2.2 + normalize-path: 2.1.1 + object.omit: 2.0.1 + parse-glob: 3.0.4 + regex-cache: 0.4.4 + dev: true + + /micromatch@3.1.10(supports-color@6.1.0): + resolution: {integrity: sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==} + engines: {node: '>=0.10.0'} + dependencies: + arr-diff: 4.0.0 + array-unique: 0.3.2 + braces: 2.3.2(supports-color@6.1.0) + define-property: 2.0.2 + extend-shallow: 3.0.2 + extglob: 2.0.4(supports-color@6.1.0) + fragment-cache: 0.2.1 + kind-of: 6.0.3 + nanomatch: 1.2.13(supports-color@6.1.0) + object.pick: 1.3.0 + regex-not: 1.0.2 + snapdragon: 0.8.2(supports-color@6.1.0) + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + + /micromatch@4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + + /miller-rabin@4.0.1: + resolution: {integrity: sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==} + hasBin: true + dependencies: + bn.js: 4.12.0 + brorand: 1.1.0 + + /mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + /mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + dependencies: + mime-db: 1.52.0 + + /mime@1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} + hasBin: true + dev: true + + /mime@2.6.0: + resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==} + engines: {node: '>=4.0.0'} + hasBin: true + dev: true + + /mimic-fn@1.2.0: + resolution: {integrity: sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==} + engines: {node: '>=4'} + dev: true + + /mimic-response@1.0.1: + resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} + engines: {node: '>=4'} + dev: false + + /min-document@2.19.0: + resolution: {integrity: sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==} + dependencies: + dom-walk: 0.1.2 + dev: false + + /minilog@3.1.0: + resolution: {integrity: sha512-Xfm4jWjWzSAduvEWtuZX/8TMkxfJlCfH7XvikCZe3ptojYTBq1eoEs3rh9/3LNLOckUP86m+8l8+Iw5NU/pBww==} + dependencies: + microee: 0.0.6 + dev: false + + /minimalistic-assert@1.0.1: + resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} + + /minimalistic-crypto-utils@1.0.1: + resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==} + + /minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + dependencies: + brace-expansion: 1.1.11 + + /minimist@0.0.8: + resolution: {integrity: sha512-miQKw5Hv4NS1Psg2517mV4e4dYNaO3++hjAvLOAzKqZ61rH8NS1SK+vbfBWZ5PY/Me/bEWhUwqMghEW5Fb9T7Q==} + dev: false + + /minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + /minipass-collect@1.0.2: + resolution: {integrity: sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==} + engines: {node: '>= 8'} + dependencies: + minipass: 3.3.6 + dev: false + + /minipass-flush@1.0.5: + resolution: {integrity: sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==} + engines: {node: '>= 8'} + dependencies: + minipass: 3.3.6 + dev: false + + /minipass-pipeline@1.2.4: + resolution: {integrity: sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==} + engines: {node: '>=8'} + dependencies: + minipass: 3.3.6 + dev: false + + /minipass@3.3.6: + resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} + engines: {node: '>=8'} + dependencies: + yallist: 4.0.0 + dev: false + + /minipass@5.0.0: + resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} + engines: {node: '>=8'} + dev: false + + /minizlib@2.1.2: + resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} + engines: {node: '>= 8'} + dependencies: + minipass: 3.3.6 + yallist: 4.0.0 + dev: false + + /mississippi@2.0.0: + resolution: {integrity: sha512-zHo8v+otD1J10j/tC+VNoGK9keCuByhKovAvdn74dmxJl9+mWHnx6EMsDN4lgRoMI/eYo2nchAxniIbUPb5onw==} + engines: {node: '>=4.0.0'} + dependencies: + concat-stream: 1.6.2 + duplexify: 3.7.1 + end-of-stream: 1.4.4 + flush-write-stream: 1.1.1 + from2: 2.3.0 + parallel-transform: 1.2.0 + pump: 2.0.1 + pumpify: 1.5.1 + stream-each: 1.2.3 + through2: 2.0.5 + dev: true + + /mississippi@3.0.0: + resolution: {integrity: sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==} + engines: {node: '>=4.0.0'} + dependencies: + concat-stream: 1.6.2 + duplexify: 3.7.1 + end-of-stream: 1.4.4 + flush-write-stream: 1.1.1 + from2: 2.3.0 + parallel-transform: 1.2.0 + pump: 3.0.0 + pumpify: 1.5.1 + stream-each: 1.2.3 + through2: 2.0.5 + + /mixin-deep@1.3.2: + resolution: {integrity: sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==} + engines: {node: '>=0.10.0'} + dependencies: + for-in: 1.0.2 + is-extendable: 1.0.1 + + /mkdirp@0.5.1: + resolution: {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.) + hasBin: true + dependencies: + minimist: 0.0.8 + dev: false + + /mkdirp@0.5.6: + resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} + hasBin: true + dependencies: + minimist: 1.2.8 + + /mkdirp@1.0.3: + resolution: {integrity: sha512-6uCP4Qc0sWsgMLy1EOqqS/3rjDHOEnsStVr/4vtAIK2Y5i2kA7lFFejYrpIyiN9w0pYf4ckeCYT9f1r1P9KX5g==} + engines: {node: '>=10'} + hasBin: true + + /mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + dev: false + + /mkpath@1.0.0: + resolution: {integrity: sha512-PbNHr7Y/9Y/2P5pKFv5XOGBfNQqZ+fdiHWcuf7swLACN5ZW5LU7J5tMU8LSBjpluAxAxKYGD9nnaIbdRy9+m1w==} + dev: false + + /mocha@4.1.0: + resolution: {integrity: sha512-0RVnjg1HJsXY2YFDoTNzcc1NKhYuXKRrBAG2gDygmJJA136Cs2QlRliZG1mA0ap7cuaT30mw16luAeln+4RiNA==} + engines: {node: '>= 4.0.0'} + hasBin: true + dependencies: + browser-stdout: 1.3.0 + commander: 2.11.0 + debug: 3.1.0(supports-color@4.4.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 + dev: false + + /moo@0.5.2: + resolution: {integrity: sha512-iSAJLHYKnX41mKcJKjqvnAN9sf0LMDTXDEvFv+ffuRR9a1MIuXLjMNL6EsnDHSkKLTWNqQQ5uo61P4EbU4NU+Q==} + dev: true + + /move-concurrently@1.0.1: + resolution: {integrity: sha512-hdrFxZOycD/g6A6SoI2bB5NA/5NEqD0569+S47WZhPvm46sD50ZHdYaFmnua5lndde9rCHGjmfK7Z8BuCt/PcQ==} + dependencies: + aproba: 1.2.0 + copy-concurrently: 1.0.5 + fs-write-stream-atomic: 1.0.10 + mkdirp: 0.5.6 + rimraf: 2.7.1 + run-queue: 1.0.3 + + /ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + + /ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + /ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + dev: true + + /multicast-dns-service-types@1.1.0: + resolution: {integrity: sha512-cnAsSVxIDsYt0v7HmC0hWZFwwXSh+E6PgCrREDuN/EsjgLwA5XRmlMHhSiDPrt6HxY1gTivEa/Zh7GtODoLevQ==} + dev: true + + /multicast-dns@6.2.3: + resolution: {integrity: sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==} + hasBin: true + dependencies: + dns-packet: 1.3.4 + thunky: 1.1.0 + dev: true + + /multipipe@0.3.1: + resolution: {integrity: sha512-ZUcepNdMeKBRn/ksm2XTxFnhBaqnBJSZNqwajmiem6b7Rp3fNAAq+twYn3kqw9YMY7HJuc7I7OObX9cMgB1ANg==} + dependencies: + duplexer2: 0.1.4 + dev: false + + /mute-stream@0.0.4: + resolution: {integrity: sha512-amvrY4m/7oZamehMoFi1tbwU/kXbVvRTGM2S7F+PZi3n51Jx+9AcSQ3EQsag3tR+hS2higfgOP/Kl8kri/X52A==} + dev: false + + /mute-stream@0.0.7: + resolution: {integrity: sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ==} + dev: true + + /nan@2.18.0: + resolution: {integrity: sha512-W7tfG7vMOGtD30sHoZSSc/JVYiyDPEyQVso/Zz+/uQd0B0L46gtC+pHha5FFMRpil6fm/AoEcRWyOVi4+E/f8w==} + requiresBuild: true + optional: true + + /nanomatch@1.2.13(supports-color@6.1.0): + resolution: {integrity: sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==} + engines: {node: '>=0.10.0'} + 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.3 + object.pick: 1.3.0 + regex-not: 1.0.2 + snapdragon: 0.8.2(supports-color@6.1.0) + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + + /natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + dev: true + + /nearley@2.20.1: + resolution: {integrity: sha512-+Mc8UaAebFzgV+KpI5n7DasuuQCHA89dmwm7JXw3TV43ukfNQ9DnBH3Mdb2g/I4Fdxc26pwimBWvjIw0UAILSQ==} + hasBin: true + dependencies: + commander: 2.20.3 + moo: 0.5.2 + railroad-diagrams: 1.0.0 + randexp: 0.4.6 + dev: true + + /negotiator@0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + dev: true + + /neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + + /nice-try@1.0.5: + resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} + + /no-case@3.0.4: + resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} + dependencies: + lower-case: 2.0.2 + tslib: 2.6.2 + dev: true + + /node-fetch@1.7.3: + resolution: {integrity: sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==} + dependencies: + encoding: 0.1.13 + is-stream: 1.1.0 + dev: true + + /node-forge@0.10.0: + resolution: {integrity: sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==} + engines: {node: '>= 6.0.0'} + dev: true + + /node-int64@0.4.0: + resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} + dev: true + + /node-libs-browser@2.2.1: + resolution: {integrity: sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==} + dependencies: + assert: 1.5.1 + browserify-zlib: 0.2.0 + buffer: 4.9.2 + console-browserify: 1.2.0 + constants-browserify: 1.0.0 + crypto-browserify: 3.12.0 + domain-browser: 1.2.0 + events: 3.3.0 + https-browserify: 1.0.0 + os-browserify: 0.3.0 + path-browserify: 0.0.1 + process: 0.11.10 + punycode: 1.4.1 + querystring-es3: 0.2.1 + readable-stream: 2.3.8 + stream-browserify: 2.0.2 + stream-http: 2.8.3 + string_decoder: 1.3.0 + timers-browserify: 2.0.12 + tty-browserify: 0.0.0 + url: 0.11.3 + util: 0.11.1 + vm-browserify: 1.1.2 + + /node-notifier@5.4.5: + resolution: {integrity: sha512-tVbHs7DyTLtzOiN78izLA85zRqB9NvEXkAf014Vx3jtSvn/xBl6bR8ZYifj+dFcFrKI21huSQgJZ6ZtL3B4HfQ==} + dependencies: + growly: 1.3.0 + is-wsl: 1.1.0 + semver: 5.7.2 + shellwords: 0.1.1 + which: 1.3.1 + dev: true + + /node-releases@2.0.14: + resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} + + /normalize-package-data@2.5.0: + resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + dependencies: + hosted-git-info: 2.8.9 + resolve: 1.22.8 + semver: 5.7.2 + validate-npm-package-license: 3.0.4 + + /normalize-path@2.1.1: + resolution: {integrity: sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==} + engines: {node: '>=0.10.0'} + dependencies: + remove-trailing-separator: 1.1.0 + + /normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + /normalize-range@0.1.2: + resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} + engines: {node: '>=0.10.0'} + dev: false + + /normalize-url@1.9.1: + resolution: {integrity: sha512-A48My/mtCklowHBlI8Fq2jFWK4tX4lJ5E6ytFsSOq1fzpvT0SQSgKhSg7lN5c2uYFOrUAOQp6zhhJnpp1eMloQ==} + engines: {node: '>=4'} + dependencies: + object-assign: 4.1.1 + prepend-http: 1.0.4 + query-string: 4.3.4 + sort-keys: 1.1.2 + dev: true + + /normalize-url@2.0.1: + resolution: {integrity: sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw==} + engines: {node: '>=4'} + dependencies: + prepend-http: 2.0.0 + query-string: 5.1.1 + sort-keys: 2.0.0 + dev: false + + /npm-normalize-package-bin@1.0.1: + resolution: {integrity: sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==} + dev: false + + /npm-run-path@2.0.2: + resolution: {integrity: sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==} + engines: {node: '>=4'} + dependencies: + path-key: 2.0.1 + dev: true + + /nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + dependencies: + boolbase: 1.0.0 + dev: true + + /num2fraction@1.2.2: + resolution: {integrity: sha512-Y1wZESM7VUThYY+4W+X4ySH2maqcA+p7UR+w8VWNWVAd6lwuXXWz/w/Cz43J/dI2I+PS6wD5N+bJUF+gjWvIqg==} + dev: false + + /number-is-nan@1.0.1: + resolution: {integrity: sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==} + engines: {node: '>=0.10.0'} + + /nwmatcher@1.4.4: + resolution: {integrity: sha512-3iuY4N5dhgMpCUrOVnuAdGrgxVqV2cJpM+XNccjR2DKOB1RUP0aA+wGXEiNziG/UKboFyGBIoKOaNlJxx8bciQ==} + dev: true + + /oauth-sign@0.9.0: + resolution: {integrity: sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==} + + /object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + /object-copy@0.1.0: + resolution: {integrity: sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==} + engines: {node: '>=0.10.0'} + dependencies: + copy-descriptor: 0.1.1 + define-property: 0.2.5 + kind-of: 3.2.2 + + /object-inspect@1.13.1: + resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} + + /object-inspect@1.4.1: + resolution: {integrity: sha512-wqdhLpfCUbEsoEwl3FXwGyv8ief1k/1aUdIPCqVnupM6e8l63BEJdiF/0swtn04/8p05tG/T0FrpTlfwvljOdw==} + dev: false + + /object-is@1.1.5: + resolution: {integrity: sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + dev: true + + /object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + /object-visit@1.0.1: + resolution: {integrity: sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==} + engines: {node: '>=0.10.0'} + dependencies: + isobject: 3.0.1 + + /object.assign@4.1.5: + resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + has-symbols: 1.0.3 + object-keys: 1.1.1 + + /object.entries@1.1.7: + resolution: {integrity: sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + dev: true + + /object.fromentries@2.0.7: + resolution: {integrity: sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + dev: true + + /object.getownpropertydescriptors@2.1.7: + resolution: {integrity: sha512-PrJz0C2xJ58FNn11XV2lr4Jt5Gzl94qpy9Lu0JlfEj14z88sqbSBJCBEzdlNUCzY2gburhbrwOZ5BHCmuNUy0g==} + engines: {node: '>= 0.8'} + dependencies: + array.prototype.reduce: 1.0.6 + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + safe-array-concat: 1.0.1 + dev: true + + /object.omit@2.0.1: + resolution: {integrity: sha512-UiAM5mhmIuKLsOvrL+B0U2d1hXHF3bFYWIuH1LMpuV2EJEHG1Ntz06PgLEHjm6VFd87NpH8rastvPoyv6UW2fA==} + engines: {node: '>=0.10.0'} + dependencies: + for-own: 0.1.5 + is-extendable: 0.1.1 + dev: true + + /object.pick@1.3.0: + resolution: {integrity: sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==} + engines: {node: '>=0.10.0'} + dependencies: + isobject: 3.0.1 + + /object.values@1.1.7: + resolution: {integrity: sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + dev: true + + /obuf@1.1.2: + resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==} + dev: true + + /omggif@1.0.9: + resolution: {integrity: sha512-VYAQRSZo7qoBcwB5G29YqVPLnxvDkWulE3x35kwH3bq4GdH/ZkHrcPPhxVfaOGYGZ5KV2/55UpcjcyNIO1qZoQ==} + dev: false + + /on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + dependencies: + ee-first: 1.1.1 + dev: true + + /on-headers@1.0.2: + resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==} + engines: {node: '>= 0.8'} + dev: true + + /once@1.3.3: + resolution: {integrity: sha512-6vaNInhu+CHxtONf3zw3vq4SP2DOQhjBvIa3rNcG0+P7eKWlYH6Peu7rHizSloRU2EwMz6GraLieis9Ac9+p1w==} + dependencies: + wrappy: 1.0.2 + dev: false + + /once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + dependencies: + wrappy: 1.0.2 + + /onetime@2.0.1: + resolution: {integrity: sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==} + engines: {node: '>=4'} + dependencies: + mimic-fn: 1.2.0 + dev: true + + /opn@5.5.0: + resolution: {integrity: sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==} + engines: {node: '>=4'} + dependencies: + is-wsl: 1.1.0 + dev: true + + /optionator@0.8.3: + resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==} + engines: {node: '>= 0.8.0'} + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.3.0 + prelude-ls: 1.1.2 + type-check: 0.3.2 + word-wrap: 1.2.5 + + /os-browserify@0.3.0: + resolution: {integrity: sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==} + + /os-homedir@1.0.2: + resolution: {integrity: sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==} + engines: {node: '>=0.10.0'} + dev: true + + /os-locale@1.4.0: + resolution: {integrity: sha512-PRT7ZORmwu2MEFt4/fv3Q+mEfN4zetKxufQrkShY2oGvUms9r8otu5HfdyIFHkYXjO7laNsoVGmM2MANfuTA8g==} + engines: {node: '>=0.10.0'} + dependencies: + lcid: 1.0.0 + dev: false + + /os-locale@2.1.0: + resolution: {integrity: sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==} + engines: {node: '>=4'} + dependencies: + execa: 0.7.0 + lcid: 1.0.0 + mem: 1.1.0 + dev: true + + /os-tmpdir@1.0.2: + resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} + engines: {node: '>=0.10.0'} + dev: true + + /p-cancelable@0.3.0: + resolution: {integrity: sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw==} + engines: {node: '>=4'} + dev: true + + /p-cancelable@0.4.1: + resolution: {integrity: sha512-HNa1A8LvB1kie7cERyy21VNeHb2CWJJYqyyC2o3klWFfMGlFmWv2Z7sFgZH8ZiaYL95ydToKTFVXgMV/Os0bBQ==} + engines: {node: '>=4'} + dev: false + + /p-event@2.3.1: + resolution: {integrity: sha512-NQCqOFhbpVTMX4qMe8PF8lbGtzZ+LCiN7pcNrb/413Na7+TRoe1xkKUzuWa/YEJdGQ0FvKtj35EEbDoVPO2kbA==} + engines: {node: '>=6'} + dependencies: + p-timeout: 2.0.1 + dev: false + + /p-finally@1.0.0: + resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} + engines: {node: '>=4'} + + /p-is-promise@1.1.0: + resolution: {integrity: sha512-zL7VE4JVS2IFSkR2GQKDSPEVxkoH43/p7oEnwpdCndKYJO0HVeRB7fA8TJwuLOTBREtK0ea8eHaxdwcpob5dmg==} + engines: {node: '>=4'} + dev: false + + /p-limit@1.3.0: + resolution: {integrity: sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==} + engines: {node: '>=4'} + dependencies: + p-try: 1.0.0 + dev: true + + /p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + dependencies: + p-try: 2.2.0 + + /p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + dependencies: + yocto-queue: 0.1.0 + dev: false + + /p-locate@2.0.0: + resolution: {integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==} + engines: {node: '>=4'} + dependencies: + p-limit: 1.3.0 + dev: true + + /p-locate@3.0.0: + resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} + engines: {node: '>=6'} + dependencies: + p-limit: 2.3.0 + + /p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + dependencies: + p-limit: 2.3.0 + + /p-map@2.1.0: + resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} + engines: {node: '>=6'} + dev: true + + /p-map@4.0.0: + resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} + engines: {node: '>=10'} + dependencies: + aggregate-error: 3.1.0 + + /p-retry@3.0.1: + resolution: {integrity: sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==} + engines: {node: '>=6'} + dependencies: + retry: 0.12.0 + dev: true + + /p-timeout@2.0.1: + resolution: {integrity: sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA==} + engines: {node: '>=4'} + dependencies: + p-finally: 1.0.0 + dev: false + + /p-try@1.0.0: + resolution: {integrity: sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==} + engines: {node: '>=4'} + dev: true + + /p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + /pako@0.2.9: + resolution: {integrity: sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==} + dev: false + + /pako@1.0.11: + resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} + + /papaparse@5.3.0: + resolution: {integrity: sha512-Lb7jN/4bTpiuGPrYy4tkKoUS8sTki8zacB5ke1p5zolhcSE4TlWgrlsxjrDTbG/dFVh07ck7X36hUf/b5V68pg==} + dev: false + + /parallel-transform@1.2.0: + resolution: {integrity: sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==} + dependencies: + cyclist: 1.0.2 + inherits: 2.0.4 + readable-stream: 2.3.8 + + /param-case@3.0.4: + resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} + dependencies: + dot-case: 3.0.4 + tslib: 2.6.2 + dev: true + + /parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + dependencies: + callsites: 3.1.0 + dev: true + + /parse-asn1@5.1.6: + resolution: {integrity: sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==} + dependencies: + asn1.js: 5.4.1 + browserify-aes: 1.2.0 + evp_bytestokey: 1.0.3 + pbkdf2: 3.1.2 + safe-buffer: 5.2.1 + + /parse-color@1.0.0: + resolution: {integrity: sha512-fuDHYgFHJGbpGMgw9skY/bj3HL/Jrn4l/5rSspy00DoT4RyLnDcRvPxdZ+r6OFwIsgAuhDh4I09tAId4mI12bw==} + dependencies: + color-convert: 0.5.3 + dev: false + + /parse-glob@3.0.4: + resolution: {integrity: sha512-FC5TeK0AwXzq3tUBFtH74naWkPQCEWs4K+xMxWZBlKDWu0bVHXGZa+KKqxKidd7xwhdZ19ZNuF2uO1M/r196HA==} + engines: {node: '>=0.10.0'} + dependencies: + glob-base: 0.3.0 + is-dotfile: 1.0.3 + is-extglob: 1.0.0 + is-glob: 2.0.1 + dev: true + + /parse-headers@2.0.5: + resolution: {integrity: sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA==} + dev: false + + /parse-json@2.2.0: + resolution: {integrity: sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==} + engines: {node: '>=0.10.0'} + dependencies: + error-ex: 1.3.2 + dev: true + + /parse-json@4.0.0: + resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} + engines: {node: '>=4'} + dependencies: + error-ex: 1.3.2 + json-parse-better-errors: 1.0.2 + + /parse-passwd@1.0.0: + resolution: {integrity: sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==} + engines: {node: '>=0.10.0'} + + /parse5-htmlparser2-tree-adapter@7.0.0: + resolution: {integrity: sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==} + dependencies: + domhandler: 5.0.3 + parse5: 7.1.2 + dev: true + + /parse5@1.5.1: + resolution: {integrity: sha512-w2jx/0tJzvgKwZa58sj2vAYq/S/K1QJfIB3cWYea/Iu1scFPDQQ3IQiVZTHWtRBwAjv2Yd7S/xeZf3XqLDb3bA==} + dev: true + + /parse5@7.1.2: + resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} + dependencies: + entities: 4.5.0 + dev: true + + /parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + dev: true + + /pascal-case@3.1.2: + resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} + dependencies: + no-case: 3.0.4 + tslib: 2.6.2 + dev: true + + /pascalcase@0.1.1: + resolution: {integrity: sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==} + engines: {node: '>=0.10.0'} + + /path-browserify@0.0.1: + resolution: {integrity: sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==} + + /path-dirname@1.0.2: + resolution: {integrity: sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q==} + + /path-exists@2.1.0: + resolution: {integrity: sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==} + engines: {node: '>=0.10.0'} + dependencies: + pinkie-promise: 2.0.1 + dev: true + + /path-exists@3.0.0: + resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} + engines: {node: '>=4'} + + /path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + /path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + /path-is-inside@1.0.2: + resolution: {integrity: sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==} + dev: true + + /path-key@2.0.1: + resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} + engines: {node: '>=4'} + + /path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + /path-to-regexp@0.1.7: + resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} + dev: true + + /path-type@1.1.0: + resolution: {integrity: sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==} + engines: {node: '>=0.10.0'} + dependencies: + graceful-fs: 4.2.11 + pify: 2.3.0 + pinkie-promise: 2.0.1 + dev: true + + /path-type@2.0.0: + resolution: {integrity: sha512-dUnb5dXUf+kzhC/W/F4e5/SkluXIFf5VUHolW1Eg1irn1hGWjPGdsRcvYJ1nD6lhk8Ir7VM0bHJKsYTx8Jx9OQ==} + engines: {node: '>=4'} + dependencies: + pify: 2.3.0 + dev: true + + /path-type@3.0.0: + resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==} + engines: {node: '>=4'} + dependencies: + pify: 3.0.0 + dev: true + + /path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + /pathfinding@0.4.18: + resolution: {integrity: sha512-R0TGEQ9GRcFCDvAWlJAWC+KGJ9SLbW4c0nuZRcioVlXVTlw+F5RvXQ8SQgSqI9KXWC1ew95vgmIiyaWTlCe9Ag==} + dependencies: + heap: 0.2.5 + dev: false + + /pbkdf2@3.1.2: + resolution: {integrity: sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==} + engines: {node: '>=0.12'} + dependencies: + create-hash: 1.2.0 + create-hmac: 1.1.7 + ripemd160: 2.0.2 + safe-buffer: 5.2.1 + sha.js: 2.4.11 + + /pend@1.2.0: + resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} + + /performance-now@2.1.0: + resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} + + /picocolors@0.2.1: + resolution: {integrity: sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==} + dev: false + + /picocolors@1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + + /picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + /pify@2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} + + /pify@3.0.0: + resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} + engines: {node: '>=4'} + + /pify@4.0.1: + resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} + engines: {node: '>=6'} + + /pinkie-promise@2.0.1: + resolution: {integrity: sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==} + engines: {node: '>=0.10.0'} + dependencies: + pinkie: 2.0.4 + + /pinkie@2.0.4: + resolution: {integrity: sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==} + engines: {node: '>=0.10.0'} + + /pkg-dir@2.0.0: + resolution: {integrity: sha512-ojakdnUgL5pzJYWw2AIDEupaQCX5OPbM688ZevubICjdIX01PRSYKqm33fJoCOJBRseYCTUlQRnBNX+Pchaejw==} + engines: {node: '>=4'} + dependencies: + find-up: 2.1.0 + dev: true + + /pkg-dir@3.0.0: + resolution: {integrity: sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==} + engines: {node: '>=6'} + dependencies: + find-up: 3.0.0 + + /pkg-dir@4.2.0: + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + engines: {node: '>=8'} + dependencies: + find-up: 4.1.0 + + /pkg-up@2.0.0: + resolution: {integrity: sha512-fjAPuiws93rm7mPUu21RdBnkeZNrbfCFCwfAhPWY+rR3zG0ubpe5cEReHOw5fIbfmsxEV/g2kSxGTATY3Bpnwg==} + engines: {node: '>=4'} + dependencies: + find-up: 2.1.0 + dev: true + + /pnpm@7.33.6: + resolution: {integrity: sha512-kOJ/04BH8YWD8zQveEzD8Yf01MqsievB//rhjc17Ld52eKC/I3SBvLj36OZhNfo0gDhW5OssRCzggv+rXZ0kHw==} + engines: {node: '>=14.6'} + hasBin: true + dev: false + + /portfinder@1.0.32(supports-color@6.1.0): + resolution: {integrity: sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg==} + engines: {node: '>= 0.12.0'} + dependencies: + async: 2.6.4 + debug: 3.2.7(supports-color@6.1.0) + mkdirp: 0.5.6 + transitivePeerDependencies: + - supports-color + dev: true + + /posix-character-classes@0.1.1: + resolution: {integrity: sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==} + engines: {node: '>=0.10.0'} + + /postcss-import@12.0.1: + resolution: {integrity: sha512-3Gti33dmCjyKBgimqGxL3vcV8w9+bsHwO5UrBawp796+jdardbcFl4RP5w/76BwNL7aGzpKstIfF9I+kdE8pTw==} + engines: {node: '>=6.0.0'} + dependencies: + postcss: 7.0.39 + postcss-value-parser: 3.3.1 + read-cache: 1.0.0 + resolve: 1.22.8 + dev: false + + /postcss-load-config@2.1.2: + resolution: {integrity: sha512-/rDeGV6vMUo3mwJZmeHfEDvwnTKKqQ0S7OHUi/kJvvtx3aWtyWG2/0ZWnzCt2keEclwN6Tf0DST2v9kITdOKYw==} + engines: {node: '>= 4'} + dependencies: + cosmiconfig: 5.2.1 + import-cwd: 2.1.0 + dev: false + + /postcss-loader@3.0.0: + resolution: {integrity: sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==} + engines: {node: '>= 6'} + dependencies: + loader-utils: 1.4.2 + postcss: 7.0.39 + postcss-load-config: 2.1.2 + schema-utils: 1.0.0 + dev: false + + /postcss-modules-extract-imports@1.2.1: + resolution: {integrity: sha512-6jt9XZwUhwmRUhb/CkyJY020PYaPJsCyt3UjbaWo6XEbH/94Hmv6MP7fG2C5NDU/BcHzyGYxNtHvM+LTf9HrYw==} + dependencies: + postcss: 6.0.23 + dev: false + + /postcss-modules-local-by-default@1.2.0: + resolution: {integrity: sha512-X4cquUPIaAd86raVrBwO8fwRfkIdbwFu7CTfEOjiZQHVQwlHRSkTgH5NLDmMm5+1hQO8u6dZ+TOOJDbay1hYpA==} + dependencies: + css-selector-tokenizer: 0.7.3 + postcss: 6.0.23 + dev: false + + /postcss-modules-scope@1.1.0: + resolution: {integrity: sha512-LTYwnA4C1He1BKZXIx1CYiHixdSe9LWYVKadq9lK5aCCMkoOkFyZ7aigt+srfjlRplJY3gIol6KUNefdMQJdlw==} + dependencies: + css-selector-tokenizer: 0.7.3 + postcss: 6.0.23 + dev: false + + /postcss-modules-values@1.3.0: + resolution: {integrity: sha512-i7IFaR9hlQ6/0UgFuqM6YWaCfA1Ej8WMg8A5DggnH1UGKJvTV/ugqq/KaULixzzOi3T/tF6ClBXcHGCzdd5unA==} + dependencies: + icss-replace-symbols: 1.1.0 + postcss: 6.0.23 + dev: false + + /postcss-simple-vars@5.0.2: + resolution: {integrity: sha512-xWIufxBoINJv6JiLb7jl5oElgp+6puJwvT5zZHliUSydoLz4DADRB3NDDsYgfKVwojn4TDLiseoC65MuS8oGGg==} + dependencies: + postcss: 7.0.39 + dev: false + + /postcss-value-parser@3.3.1: + resolution: {integrity: sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==} + dev: false + + /postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + dev: false + + /postcss@6.0.23: + resolution: {integrity: sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==} + engines: {node: '>=4.0.0'} + dependencies: + chalk: 2.4.2 + source-map: 0.6.1 + supports-color: 5.5.0 + dev: false + + /postcss@7.0.39: + resolution: {integrity: sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==} + engines: {node: '>=6.0.0'} + dependencies: + picocolors: 0.2.1 + source-map: 0.6.1 + dev: false + + /prelude-ls@1.1.2: + resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==} + engines: {node: '>= 0.8.0'} + + /prepend-http@1.0.4: + resolution: {integrity: sha512-PhmXi5XmoyKw1Un4E+opM2KcsJInDvKyuOumcjjw3waw86ZNjHwVUOOWLc4bCzLdcKNaWBH9e99sbWzDQsVaYg==} + engines: {node: '>=0.10.0'} + dev: true + + /prepend-http@2.0.0: + resolution: {integrity: sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==} + engines: {node: '>=4'} + dev: false + + /preserve@0.2.0: + resolution: {integrity: sha512-s/46sYeylUfHNjI+sA/78FAHlmIuKqI9wNnzEOGehAlUUYeObv5C2mOinXBjyUyWmJ2SfcS2/ydApH4hTF4WXQ==} + engines: {node: '>=0.10.0'} + dev: true + + /pretty-error@2.1.2: + resolution: {integrity: sha512-EY5oDzmsX5wvuynAByrmY0P0hcp+QpnAKbJng2A2MPjVKXCxrDSUkzghVJ4ZGPIv+JC4gX8fPUWscC0RtjsWGw==} + dependencies: + lodash: 4.17.21 + renderkid: 2.0.7 + dev: true + + /pretty-format@21.2.1: + resolution: {integrity: sha512-ZdWPGYAnYfcVP8yKA3zFjCn8s4/17TeYH28MXuC8vTp0o21eXjbFGcOAXZEaDaOFJjc3h2qa7HQNHNshhvoh2A==} + dependencies: + ansi-regex: 3.0.1 + ansi-styles: 3.2.1 + dev: true + + /pretty-format@24.9.0: + resolution: {integrity: sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==} + engines: {node: '>= 6'} + dependencies: + '@jest/types': 24.9.0 + ansi-regex: 4.1.1 + ansi-styles: 3.2.1 + react-is: 16.13.1 + dev: true + + /private@0.1.8: + resolution: {integrity: sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==} + engines: {node: '>= 0.6'} + dev: true + + /process-nextick-args@1.0.7: + resolution: {integrity: sha512-yN0WQmuCX63LP/TMvAg31nvT6m4vDqJEiiv2CAZqWOGNWutc9DfDk1NPYYmKUFmaVM2UwDowH4u5AHWYP/jxKw==} + dev: false + + /process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + + /process@0.11.10: + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} + + /process@0.5.2: + resolution: {integrity: sha512-oNpcutj+nYX2FjdEW7PGltWhXulAnFlM0My/k48L90hARCOJtvBbQXc/6itV2jDvU5xAAtonP+r6wmQgCcbAUA==} + engines: {node: '>= 0.6.0'} + dev: false + + /progress@2.0.3: + resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} + engines: {node: '>=0.4.0'} + dev: true + + /promise-inflight@1.0.1(bluebird@3.7.2): + resolution: {integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==} + peerDependencies: + bluebird: '*' + peerDependenciesMeta: + bluebird: + optional: true + dependencies: + bluebird: 3.7.2 + + /promise@7.3.1: + resolution: {integrity: sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==} + dependencies: + asap: 2.0.6 + dev: true + + /prop-types-exact@1.2.0: + resolution: {integrity: sha512-K+Tk3Kd9V0odiXFP9fwDHUYRyvK3Nun3GVyPapSIs5OBkITAm15W0CPFD/YKTkMUAbc0b9CUwRQp2ybiBIq+eA==} + dependencies: + has: 1.0.4 + object.assign: 4.1.5 + reflect.ownkeys: 0.2.0 + dev: true + + /prop-types@15.8.1: + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + react-is: 16.13.1 + + /proxy-addr@2.0.7: + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} + dependencies: + forwarded: 0.2.0 + ipaddr.js: 1.9.1 + dev: true + + /proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + dev: true + + /prr@1.0.1: + resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==} + + /pseudomap@1.0.2: + resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} + dev: true + + /psl@1.9.0: + resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} + + /public-encrypt@4.0.3: + resolution: {integrity: sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==} + dependencies: + bn.js: 4.12.0 + browserify-rsa: 4.1.0 + create-hash: 1.2.0 + parse-asn1: 5.1.6 + randombytes: 2.1.0 + safe-buffer: 5.2.1 + + /pump@2.0.1: + resolution: {integrity: sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==} + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + + /pump@3.0.0: + resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + + /pumpify@1.5.1: + resolution: {integrity: sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==} + dependencies: + duplexify: 3.7.1 + inherits: 2.0.4 + pump: 2.0.1 + + /punycode@1.4.1: + resolution: {integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==} + + /punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + /q@1.5.1: + resolution: {integrity: sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==} + engines: {node: '>=0.6.0', teleport: '>=0.2.0'} + dev: false + + /qs@6.11.0: + resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} + engines: {node: '>=0.6'} + dependencies: + side-channel: 1.0.4 + dev: true + + /qs@6.11.2: + resolution: {integrity: sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==} + engines: {node: '>=0.6'} + dependencies: + side-channel: 1.0.4 + + /qs@6.5.3: + resolution: {integrity: sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==} + engines: {node: '>=0.6'} + + /query-string@4.3.4: + resolution: {integrity: sha512-O2XLNDBIg1DnTOa+2XrIwSiXEV8h2KImXUnjhhn2+UsvZ+Es2uyd5CCRTNQlDGbzUQOW3aYCBx9rVA6dzsiY7Q==} + engines: {node: '>=0.10.0'} + dependencies: + object-assign: 4.1.1 + strict-uri-encode: 1.1.0 + dev: true + + /query-string@5.1.1: + resolution: {integrity: sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==} + engines: {node: '>=0.10.0'} + dependencies: + decode-uri-component: 0.2.2 + object-assign: 4.1.1 + strict-uri-encode: 1.1.0 + dev: false + + /querystring-es3@0.2.1: + resolution: {integrity: sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==} + engines: {node: '>=0.4.x'} + + /querystringify@2.2.0: + resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} + dev: true + + /queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + /quote-stream@1.0.2: + resolution: {integrity: sha512-kKr2uQ2AokadPjvTyKJQad9xELbZwYzWlNfI3Uz2j/ib5u6H9lDP7fUUR//rMycd0gv4Z5P1qXMfXR8YpIxrjQ==} + hasBin: true + dependencies: + buffer-equal: 0.0.1 + minimist: 1.2.8 + through2: 2.0.5 + dev: false + + /raf@3.4.1: + resolution: {integrity: sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==} + dependencies: + performance-now: 2.1.0 + dev: true + + /railroad-diagrams@1.0.0: + resolution: {integrity: sha512-cz93DjNeLY0idrCNOH6PviZGRN9GJhsdm9hpn1YCS879fj4W+x5IFJhhkRZcwVgMmFF7R82UA/7Oh+R8lLZg6A==} + dev: true + + /randexp@0.4.6: + resolution: {integrity: sha512-80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ==} + engines: {node: '>=0.12'} + dependencies: + discontinuous-range: 1.0.0 + ret: 0.1.15 + dev: true + + /randomatic@3.1.1: + resolution: {integrity: sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==} + engines: {node: '>= 0.10.0'} + dependencies: + is-number: 4.0.0 + kind-of: 6.0.3 + math-random: 1.0.4 + dev: true + + /randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + dependencies: + safe-buffer: 5.2.1 + + /randomfill@1.0.4: + resolution: {integrity: sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==} + dependencies: + randombytes: 2.1.0 + safe-buffer: 5.2.1 + + /range-parser@1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} + dev: true + + /raw-body@2.5.1: + resolution: {integrity: sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==} + engines: {node: '>= 0.8'} + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + dev: true + + /raw-loader@0.5.1: + resolution: {integrity: sha512-sf7oGoLuaYAScB4VGr0tzetsYlS8EJH6qnTCfQ/WVEa89hALQ4RQfCKt5xCyPQKPDUbVUAIP1QsxAwfAjlDp7Q==} + dev: false + + /react-contextmenu@2.9.4(prop-types@15.8.1)(react-dom@16.14.0)(react@16.14.0): + resolution: {integrity: sha512-ma4YQw4J7JNv8L8mMVd1NHHbvH3+gaK/rQ6FC5Tft7OCUweKi7PHqHEE0fDF2009FLSGoV5JnjPnTTEyThqaJg==} + 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 + dependencies: + classnames: 2.2.6 + object-assign: 4.1.1 + prop-types: 15.8.1 + react: 16.14.0 + react-dom: 16.14.0(react@16.14.0) + dev: false + + /react-dom@16.14.0(react@16.14.0): + resolution: {integrity: sha512-1gCeQXDLoIqMgqD3IO2Ah9bnf0w9kzhwN5q4FGnHZ67hBm9yePzB5JJAIQCc8x3pFnNlwFq4RidZggNAAkzWWw==} + peerDependencies: + react: ^16.14.0 + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + prop-types: 15.8.1 + react: 16.14.0 + scheduler: 0.19.1 + + /react-draggable@3.0.5(react-dom@16.14.0)(react@16.14.0): + resolution: {integrity: sha512-qo76q6+pafyGllbmfc+CgWfOkwY9v3UoJa3jp6xG2vdsRY8uJTN1kqNievLj0uVNjEqCvZ0OFiEBxlAJNj3OTg==} + peerDependencies: + react: '>= 16.3.0' + react-dom: '>= 16.3.0' + dependencies: + classnames: 2.2.6 + prop-types: 15.8.1 + react: 16.14.0 + react-dom: 16.14.0(react@16.14.0) + dev: false + + /react-ga@2.5.3: + resolution: {integrity: sha512-25wvPv1PVLDLhw1gEYP33h0V2sJHahKMfUCAxhq8JPYmNQwx1fcjJAkJk+WmSqGN93lHLhExDkxy3SQizQnx3A==} + optionalDependencies: + prop-types: 15.8.1 + react: 16.14.0 + dev: false + + /react-intl-redux@0.7.0(react-intl@2.9.0)(react-redux@5.0.7): + resolution: {integrity: sha512-T7I7Yy1UkvD8rOB1B+SCG63LYJBtBcvGJ8FVJ8g8Yjhm4+rEhKzJuh1MaQBhwKZNlVcHlx4SlKdtkw8urdZdrA==} + peerDependencies: + react-intl: ^2.2.2 + react-redux: ^5.0.1 + dependencies: + prop-types: 15.8.1 + react-intl: 2.9.0(prop-types@15.8.1)(react@16.14.0) + react-redux: 5.0.7(react@16.14.0)(redux@3.7.2) + dev: false + + /react-intl@2.9.0(prop-types@15.8.1)(react@16.14.0): + resolution: {integrity: sha512-27jnDlb/d2A7mSJwrbOBnUgD+rPep+abmoJE511Tf8BnoONIAUehy/U1zZCHGO17mnOwMWxqN4qC0nW11cD6rA==} + peerDependencies: + prop-types: ^15.5.4 + react: ^0.14.9 || ^15.0.0 || ^16.0.0 + dependencies: + hoist-non-react-statics: 3.3.2 + intl-format-cache: 2.2.9 + intl-messageformat: 2.2.0 + intl-relativeformat: 2.2.0 + invariant: 2.2.4 + prop-types: 15.8.1 + react: 16.14.0 + dev: false + + /react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + + /react-lifecycles-compat@3.0.4: + resolution: {integrity: sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==} + dev: false + + /react-modal@3.9.1(react-dom@16.14.0)(react@16.14.0): + resolution: {integrity: sha512-k+TUkhGWpIVHLsEyjNmlyOYL0Uz03fNZvlkhCImd1h+6fhNgTi6H6jexVXPVhD2LMMDzJyfugxMN+APN/em+eQ==} + peerDependencies: + react: ^0.14.0 || ^15.0.0 || ^16 + react-dom: ^0.14.0 || ^15.0.0 || ^16 + dependencies: + exenv: 1.2.2 + prop-types: 15.8.1 + react: 16.14.0 + react-dom: 16.14.0(react@16.14.0) + react-lifecycles-compat: 3.0.4 + warning: 4.0.3 + dev: false + + /react-popover@0.5.10: + resolution: {integrity: sha512-5SYDTfncywSH00I70oHd4gFRUR8V0rJ4sRADSI/P6G0RVXp9jUgaWloJ0Bk+SFnjpLPuipTKuzQNNd2CTs5Hrw==} + dependencies: + css-vendor: 0.3.8 + debug: 2.6.9(supports-color@6.1.0) + lodash.throttle: 3.0.4 + prop-types: 15.8.1 + transitivePeerDependencies: + - supports-color + dev: false + + /react-redux@5.0.7(react@16.14.0)(redux@3.7.2): + resolution: {integrity: sha512-5VI8EV5hdgNgyjfmWzBbdrqUkrVRKlyTKk1sGH3jzM2M2Mhj/seQgPXaz6gVAj2lz/nz688AdTqMO18Lr24Zhg==} + peerDependencies: + react: ^0.14.0 || ^15.0.0-0 || ^16.0.0-0 + redux: ^2.0.0 || ^3.0.0 || ^4.0.0-0 + dependencies: + hoist-non-react-statics: 2.5.5 + invariant: 2.2.4 + lodash: 4.17.21 + lodash-es: 4.17.21 + loose-envify: 1.4.0 + prop-types: 15.8.1 + react: 16.14.0 + redux: 3.7.2 + dev: false + + /react-responsive@4.1.0(react@16.14.0): + resolution: {integrity: sha512-ZuDraf0qsJlyiTwzeva+foHx83IP6SIhru9o7BvMwQ4ZHjRIL5WjdgVNNrKSRbmeWO9rEJoMpabei/5lJn8KaA==} + engines: {node: '>= 0.10'} + peerDependencies: + react: ^16.0.0 + dependencies: + hyphenate-style-name: 1.0.4 + matchmediaquery: 0.2.1 + prop-types: 15.8.1 + react: 16.14.0 + dev: false + + /react-string-replace@0.4.4: + resolution: {integrity: sha512-FAMkhxmDpCsGTwTZg7p/2v+/GTmxAp73so3fbSvlAcBBX36ujiGRNEaM/1u+jiYQrArhns+7eE92g2pi5E5FUA==} + engines: {node: '>=0.12.0'} + dependencies: + lodash: 4.17.21 + dev: false + + /react-style-proptype@3.2.2: + resolution: {integrity: sha512-ywYLSjNkxKHiZOqNlso9PZByNEY+FTyh3C+7uuziK0xFXu9xzdyfHwg4S9iyiRRoPCR4k2LqaBBsWVmSBwCWYQ==} + dependencies: + prop-types: 15.8.1 + dev: false + + /react-tabs@2.3.0(react@16.14.0): + resolution: {integrity: sha512-pYaefgVy76/36AMEP+B8YuVVzDHa3C5UFZ3REU78zolk0qMxEhKvUFofvDCXyLZwf0RZjxIfiwok1BEb18nHyA==} + peerDependencies: + react: ^0.14.9 || ^15.3.0 || ^16.0.0 + dependencies: + classnames: 2.2.6 + prop-types: 15.8.1 + react: 16.14.0 + dev: false + + /react-test-renderer@16.2.0(react@16.14.0): + resolution: {integrity: sha512-Kd4gJFtpNziR9ElOE/C23LeflKLZPRpNQYWP3nQBY43SJ5a+xyEGSeMrm2zxNKXcnCbBS/q1UpD9gqd5Dv+rew==} + peerDependencies: + react: ^16.0.0 + dependencies: + fbjs: 0.8.18 + object-assign: 4.1.1 + prop-types: 15.8.1 + react: 16.14.0 + dev: true + + /react-tooltip@3.8.0(react-dom@16.14.0)(react@16.14.0): + resolution: {integrity: sha512-Uj/vVd0uGuqwTkWeRjKS56T2iwOSvsSMbjqTK7AseHZEMND+WCXXUajaF7+ZsJWTZgnpeT9kBnaBFhchzeDTbw==} + engines: {node: '>=4.2.1'} + peerDependencies: + react: '>=0.14' + react-dom: '>=0.14' + dependencies: + classnames: 2.2.6 + prop-types: 15.8.1 + react: 16.14.0 + react-dom: 16.14.0(react@16.14.0) + dev: false + + /react-virtualized@9.20.1(react-dom@16.14.0)(react@16.14.0): + resolution: {integrity: sha512-xIWxBsyNAjceqD3hsE0nw5TcDVxKbIepsHhvS2XneHmNz0KlKxdLdGBmGZBM9ZesEmbZ5EO0Sw70TB1MeCmpbQ==} + peerDependencies: + react: ^15.3.0 || ^16.0.0-alpha + react-dom: ^15.3.0 || ^16.0.0-alpha + dependencies: + babel-runtime: 6.26.0 + classnames: 2.2.6 + dom-helpers: 3.4.0 + loose-envify: 1.4.0 + prop-types: 15.8.1 + react: 16.14.0 + react-dom: 16.14.0(react@16.14.0) + react-lifecycles-compat: 3.0.4 + dev: false + + /react@16.14.0: + resolution: {integrity: sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g==} + engines: {node: '>=0.10.0'} + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + prop-types: 15.8.1 + + /read-cache@1.0.0: + resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} + dependencies: + pify: 2.3.0 + dev: false + + /read-package-json@2.1.2: + resolution: {integrity: sha512-D1KmuLQr6ZSJS0tW8hf3WGpRlwszJOXZ3E8Yd/DNRaM5d+1wVRZdHlpGBLAuovjr28LbWvjpWkBHMxpRGGjzNA==} + dependencies: + glob: 7.2.3 + json-parse-even-better-errors: 2.3.1 + normalize-package-data: 2.5.0 + npm-normalize-package-bin: 1.0.1 + dev: false + + /read-pkg-up@1.0.1: + resolution: {integrity: sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==} + engines: {node: '>=0.10.0'} + dependencies: + find-up: 1.1.2 + read-pkg: 1.1.0 + dev: true + + /read-pkg-up@2.0.0: + resolution: {integrity: sha512-1orxQfbWGUiTn9XsPlChs6rLie/AV9jwZTGmu2NZw/CUDJQchXJFYE0Fq5j7+n558T1JhDWLdhyd1Zj+wLY//w==} + engines: {node: '>=4'} + dependencies: + find-up: 2.1.0 + read-pkg: 2.0.0 + dev: true + + /read-pkg-up@3.0.0: + resolution: {integrity: sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw==} + engines: {node: '>=4'} + dependencies: + find-up: 2.1.0 + read-pkg: 3.0.0 + dev: true + + /read-pkg@1.1.0: + resolution: {integrity: sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==} + engines: {node: '>=0.10.0'} + dependencies: + load-json-file: 1.1.0 + normalize-package-data: 2.5.0 + path-type: 1.1.0 + dev: true + + /read-pkg@2.0.0: + resolution: {integrity: sha512-eFIBOPW7FGjzBuk3hdXEuNSiTZS/xEMlH49HxMyzb0hyPfu4EhVjT2DH32K1hSSmVq4sebAWnZuuY5auISUTGA==} + engines: {node: '>=4'} + dependencies: + load-json-file: 2.0.0 + normalize-package-data: 2.5.0 + path-type: 2.0.0 + dev: true + + /read-pkg@3.0.0: + resolution: {integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==} + engines: {node: '>=4'} + dependencies: + load-json-file: 4.0.0 + normalize-package-data: 2.5.0 + path-type: 3.0.0 + dev: true + + /readable-stream@2.0.6: + resolution: {integrity: sha512-TXcFfb63BQe1+ySzsHZI/5v1aJPCShfqvWJ64ayNImXMsN1Cd0YGk/wm8KB7/OeessgPc9QvS9Zou8QTkFzsLw==} + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 1.0.7 + string_decoder: 0.10.31 + util-deprecate: 1.0.2 + dev: false + + /readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + + /readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + + /readdirp@2.2.1(supports-color@6.1.0): + resolution: {integrity: sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==} + engines: {node: '>=0.10'} + dependencies: + graceful-fs: 4.2.11 + micromatch: 3.1.10(supports-color@6.1.0) + readable-stream: 2.3.8 + transitivePeerDependencies: + - supports-color + + /readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + requiresBuild: true + dependencies: + picomatch: 2.3.1 + optional: true + + /readline2@0.1.1: + resolution: {integrity: sha512-qs8GGG+hLGMaDOGjd+mDglDoYcHDkjIY7z5RU0/ApsGT0qypyrWskNeemUqD+UxIXiZoMYT5aLwGp4ehoyZhIg==} + dependencies: + mute-stream: 0.0.4 + strip-ansi: 2.0.1 + dev: false + + /redux-mock-store@1.5.3: + resolution: {integrity: sha512-ryhkkb/4D4CUGpAV2ln1GOY/uh51aczjcRz9k2L2bPx/Xja3c5pSGJJPyR25GNVRXtKIExScdAgFdiXp68GmJA==} + dependencies: + lodash.isplainobject: 4.0.6 + dev: true + + /redux-throttle@0.1.1: + resolution: {integrity: sha512-24stzg4+1xtlO8ubP4HKudpBdPsG4qvbn0Z9hv8tz6fM6ZcQJe2dKEwYIqTl8+yPMGgjNKHp1lzTwRqjWCxj/Q==} + dependencies: + lodash.throttle: 4.0.1 + dev: false + + /redux@3.7.2: + resolution: {integrity: sha512-pNqnf9q1hI5HHZRBkj3bAngGZW/JMCmexDlOxw4XagXY2o1327nHH54LoTjiPJ0gizoqPDRqWyX/00g0hD6w+A==} + dependencies: + lodash: 4.17.21 + lodash-es: 4.17.21 + loose-envify: 1.4.0 + symbol-observable: 1.2.0 + dev: false + + /reflect.ownkeys@0.2.0: + resolution: {integrity: sha512-qOLsBKHCpSOFKK1NUOCGC5VyeufB6lEsFe92AL2bhIJsacZS1qdoOZSbPk3MYKuT2cFlRDnulKXuuElIrMjGUg==} + dev: true + + /regenerate-unicode-properties@10.1.1: + resolution: {integrity: sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==} + engines: {node: '>=4'} + dependencies: + regenerate: 1.4.2 + dev: true + + /regenerate@1.4.2: + resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} + dev: true + + /regenerator-runtime@0.11.1: + resolution: {integrity: sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==} + + /regenerator-runtime@0.14.1: + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + + /regenerator-transform@0.15.2: + resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==} + dependencies: + '@babel/runtime': 7.23.7 + dev: true + + /regex-cache@0.4.4: + resolution: {integrity: sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==} + engines: {node: '>=0.10.0'} + dependencies: + is-equal-shallow: 0.1.3 + dev: true + + /regex-not@1.0.2: + resolution: {integrity: sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==} + engines: {node: '>=0.10.0'} + dependencies: + extend-shallow: 3.0.2 + safe-regex: 1.1.0 + + /regexp.prototype.flags@1.5.1: + resolution: {integrity: sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + set-function-name: 2.0.1 + dev: true + + /regexpp@2.0.1: + resolution: {integrity: sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==} + engines: {node: '>=6.5.0'} + dev: true + + /regexpu-core@5.3.2: + resolution: {integrity: sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==} + engines: {node: '>=4'} + dependencies: + '@babel/regjsgen': 0.8.0 + regenerate: 1.4.2 + regenerate-unicode-properties: 10.1.1 + regjsparser: 0.9.1 + unicode-match-property-ecmascript: 2.0.0 + unicode-match-property-value-ecmascript: 2.1.0 + dev: true + + /regjsparser@0.9.1: + resolution: {integrity: sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==} + hasBin: true + dependencies: + jsesc: 0.5.0 + dev: true + + /relateurl@0.2.7: + resolution: {integrity: sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==} + engines: {node: '>= 0.10'} + dev: true + + /remove-trailing-separator@1.1.0: + resolution: {integrity: sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==} + requiresBuild: true + + /renderkid@2.0.7: + resolution: {integrity: sha512-oCcFyxaMrKsKcTY59qnCAtmDVSLfPbrv6A3tVbPdFMMrv5jaK10V6m40cKsoPNhAqN6rmHW9sswW4o3ruSrwUQ==} + dependencies: + css-select: 4.3.0 + dom-converter: 0.2.0 + htmlparser2: 6.1.0 + lodash: 4.17.21 + strip-ansi: 3.0.1 + dev: true + + /repeat-element@1.1.4: + resolution: {integrity: sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==} + engines: {node: '>=0.10.0'} + + /repeat-string@1.6.1: + resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==} + engines: {node: '>=0.10'} + + /repeating@2.0.1: + resolution: {integrity: sha512-ZqtSMuVybkISo2OWvqvm7iHSWngvdaW3IpsT9/uP8v4gMi591LY6h35wdOfvQdWCKFWZWm2Y1Opp4kV7vQKT6A==} + engines: {node: '>=0.10.0'} + dependencies: + is-finite: 1.1.0 + dev: true + + /request@2.88.2: + resolution: {integrity: sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==} + engines: {node: '>= 6'} + deprecated: request has been deprecated, see https://github.com/request/request/issues/3142 + dependencies: + aws-sign2: 0.7.0 + aws4: 1.12.0 + caseless: 0.12.0 + combined-stream: 1.0.8 + extend: 3.0.2 + forever-agent: 0.6.1 + form-data: 2.3.3 + har-validator: 5.1.5 + http-signature: 1.2.0 + is-typedarray: 1.0.0 + isstream: 0.1.2 + json-stringify-safe: 5.0.1 + mime-types: 2.1.35 + oauth-sign: 0.9.0 + performance-now: 2.1.0 + qs: 6.5.3 + safe-buffer: 5.2.1 + tough-cookie: 2.5.0 + tunnel-agent: 0.6.0 + uuid: 3.4.0 + + /require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + /require-main-filename@1.0.1: + resolution: {integrity: sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug==} + dev: true + + /require-main-filename@2.0.0: + resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} + + /requires-port@1.0.0: + resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + dev: true + + /resolve-cwd@2.0.0: + resolution: {integrity: sha512-ccu8zQTrzVr954472aUVPLEcB3YpKSYR3cg/3lo1okzobPBM+1INXBbBZlDbnI/hbEocnf8j0QVo43hQKrbchg==} + engines: {node: '>=4'} + dependencies: + resolve-from: 3.0.0 + + /resolve-dir@1.0.1: + resolution: {integrity: sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==} + engines: {node: '>=0.10.0'} + dependencies: + expand-tilde: 2.0.2 + global-modules: 1.0.0 + + /resolve-from@3.0.0: + resolution: {integrity: sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==} + engines: {node: '>=4'} + + /resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + dev: true + + /resolve-url@0.2.1: + resolution: {integrity: sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==} + deprecated: https://github.com/lydell/resolve-url#deprecated + + /resolve@1.1.7: + resolution: {integrity: sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg==} + dev: true + + /resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + hasBin: true + dependencies: + is-core-module: 2.13.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + /resolve@2.0.0-next.5: + resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} + hasBin: true + dependencies: + is-core-module: 2.13.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: true + + /responselike@1.0.2: + resolution: {integrity: sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==} + dependencies: + lowercase-keys: 1.0.1 + dev: false + + /restore-cursor@2.0.0: + resolution: {integrity: sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==} + engines: {node: '>=4'} + dependencies: + onetime: 2.0.1 + signal-exit: 3.0.7 + dev: true + + /ret@0.1.15: + resolution: {integrity: sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==} + engines: {node: '>=0.12'} + + /retry@0.12.0: + resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} + engines: {node: '>= 4'} + dev: true + + /reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + /rimraf@2.6.3: + resolution: {integrity: sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==} + hasBin: true + dependencies: + glob: 7.2.3 + dev: true + + /rimraf@2.7.1: + resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} + hasBin: true + dependencies: + glob: 7.2.3 + + /rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + hasBin: true + dependencies: + glob: 7.2.3 + + /ripemd160@2.0.2: + resolution: {integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==} + dependencies: + hash-base: 3.1.0 + inherits: 2.0.4 + + /rst-selector-parser@2.2.3: + resolution: {integrity: sha512-nDG1rZeP6oFTLN6yNDV/uiAvs1+FS/KlrEwh7+y7dpuApDBy6bI2HTBcc0/V8lv9OTqfyD34eF7au2pm8aBbhA==} + dependencies: + lodash.flattendeep: 4.4.0 + nearley: 2.20.1 + dev: true + + /rsvp@3.6.2: + resolution: {integrity: sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw==} + engines: {node: 0.12.* || 4.* || 6.* || >= 7.*} + dev: true + + /run-async@2.4.1: + resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} + engines: {node: '>=0.12.0'} + dev: true + + /run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + dependencies: + queue-microtask: 1.2.3 + + /run-queue@1.0.3: + resolution: {integrity: sha512-ntymy489o0/QQplUDnpYAYUsO50K9SBrIVaKCWDOJzYJts0f9WH9RFJkyagebkw5+y1oi00R7ynNW/d12GBumg==} + dependencies: + aproba: 1.2.0 + + /rx@2.5.3: + resolution: {integrity: sha512-u5qvfulb7NXoY/+OE28920WEgFi6aiDjf5iF9rA2f9tBXejLgTLd0WxkclvIQWjFFHfNJlb7pSTsrjgiDh+Uug==} + dev: false + + /rxjs@6.6.7: + resolution: {integrity: sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==} + engines: {npm: '>=2.0.0'} + dependencies: + tslib: 1.14.1 + dev: true + + /safe-array-concat@1.0.1: + resolution: {integrity: sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==} + engines: {node: '>=0.4'} + dependencies: + call-bind: 1.0.5 + get-intrinsic: 1.2.2 + has-symbols: 1.0.3 + isarray: 2.0.5 + dev: true + + /safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + /safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + /safe-regex-test@1.0.0: + resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} + dependencies: + call-bind: 1.0.5 + get-intrinsic: 1.2.2 + is-regex: 1.1.4 + dev: true + + /safe-regex@1.1.0: + resolution: {integrity: sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==} + dependencies: + ret: 0.1.15 + + /safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + /sane@2.5.2: + resolution: {integrity: sha512-OuZwD1QJ2R9Dbnhd7Ur8zzD8l+oADp9npyxK63Q9nZ4AjhB2QwDQcQlD8iuUsGm5AZZqtEuCaJvK1rxGRxyQ1Q==} + engines: {node: '>=0.6.0'} + deprecated: some dependency vulnerabilities fixed, support for node < 10 dropped, and newer ECMAScript syntax/features added + hasBin: true + dependencies: + anymatch: 2.0.0(supports-color@6.1.0) + capture-exit: 1.2.0 + exec-sh: 0.2.2 + fb-watchman: 2.0.2 + micromatch: 3.1.10(supports-color@6.1.0) + minimist: 1.2.8 + walker: 1.0.8 + watch: 0.18.0 + optionalDependencies: + fsevents: 1.2.13 + transitivePeerDependencies: + - supports-color + dev: true + + /sax@1.3.0: + resolution: {integrity: sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==} + dev: true + + /scheduler@0.19.1: + resolution: {integrity: sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==} + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + + /schema-utils@0.4.7: + resolution: {integrity: sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==} + engines: {node: '>= 4'} + dependencies: + ajv: 6.12.6 + ajv-keywords: 3.5.2(ajv@6.12.6) + + /schema-utils@1.0.0: + resolution: {integrity: sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==} + engines: {node: '>= 4'} + dependencies: + ajv: 6.12.6 + ajv-errors: 1.0.1(ajv@6.12.6) + ajv-keywords: 3.5.2(ajv@6.12.6) + + /schema-utils@2.7.1: + resolution: {integrity: sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==} + engines: {node: '>= 8.9.0'} + dependencies: + '@types/json-schema': 7.0.15 + ajv: 6.12.6 + ajv-keywords: 3.5.2(ajv@6.12.6) + dev: true + + /schema-utils@3.3.0: + resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} + engines: {node: '>= 10.13.0'} + dependencies: + '@types/json-schema': 7.0.15 + ajv: 6.12.6 + ajv-keywords: 3.5.2(ajv@6.12.6) + + /scratch-render-fonts@1.0.0-prerelease.20210401210003: + resolution: {integrity: sha512-sgU+LIXTLKk4f7FZOv/B61dpvmfpnlXFf912T6T4GpOfzx99JPRhXPyErZWuwPz8NEzthkhpO7iF2AqgzUxJfA==} + dependencies: + base64-loader: 1.0.0 + dev: false + + /scratch-sb1-converter@0.2.7: + resolution: {integrity: sha512-MF1NzmRLbgCiq7wiSTuk2C9rQC8uM5Wj7SaYsn1SEMWNK9rtK0uc3LSm8FnEt14QS/1Icx2YgMsUPKR0HaPDdQ==} + dependencies: + js-md5: 0.7.3 + minilog: 3.1.0 + text-encoding: 0.7.0 + dev: false + + /scratch-translate-extension-languages@0.0.20191118205314: + resolution: {integrity: sha512-r0lvpgQjPMjbhI2wROrgoXzBhCvWJdkbAqJMfl2CdNqrwBpUXqLvNNtI3VtNLPJAcp9VfxEylkU9lVZ0gvU46Q==} + dev: false + + /seedrandom@3.0.5: + resolution: {integrity: sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==} + dev: false + + /seek-bzip@1.0.6: + resolution: {integrity: sha512-e1QtP3YL5tWww8uKaOCQ18UxIT2laNBXHjV/S2WYCiK4udiv8lkG89KRIoCjUagnAmCBurjF4zEVX2ByBbnCjQ==} + hasBin: true + dependencies: + commander: 2.20.3 + dev: false + + /select-hose@2.0.0: + resolution: {integrity: sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==} + dev: true + + /selenium-webdriver@3.6.0: + resolution: {integrity: sha512-WH7Aldse+2P5bbFBO4Gle/nuQOdVwpHMTL6raL3uuBj/vPG07k6uzt3aiahu352ONBr5xXh0hDlM3LhtXPOC4Q==} + engines: {node: '>= 6.9.0'} + dependencies: + jszip: 3.10.1 + rimraf: 2.7.1 + tmp: 0.0.30 + xml2js: 0.4.23 + dev: true + + /selfsigned@1.10.14: + resolution: {integrity: sha512-lkjaiAye+wBZDCBsu5BGi0XiLRxeUlsGod5ZP924CRSEoGuZAw/f7y9RKu28rwTfiHVhdavhB0qH0INV6P1lEA==} + dependencies: + node-forge: 0.10.0 + dev: true + + /semver@5.5.0: + resolution: {integrity: sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==} + hasBin: true + dev: true + + /semver@5.7.2: + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} + hasBin: true + + /semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + /semver@7.5.4: + resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: false + + /send@0.18.0(supports-color@6.1.0): + resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} + engines: {node: '>= 0.8.0'} + dependencies: + debug: 2.6.9(supports-color@6.1.0) + 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 + transitivePeerDependencies: + - supports-color + dev: true + + /serialize-javascript@1.9.1: + resolution: {integrity: sha512-0Vb/54WJ6k5v8sSWN09S0ora+Hnr+cX40r9F170nT+mSkaxltoE/7R3OrIdBSUv1OoiobH1QoWQbCnAO+e8J1A==} + dev: true + + /serialize-javascript@4.0.0: + resolution: {integrity: sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==} + dependencies: + randombytes: 2.1.0 + + /serialize-javascript@5.0.1: + resolution: {integrity: sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==} + dependencies: + randombytes: 2.1.0 + dev: false + + /serve-index@1.9.1(supports-color@6.1.0): + resolution: {integrity: sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==} + engines: {node: '>= 0.8.0'} + dependencies: + accepts: 1.3.8 + batch: 0.6.1 + debug: 2.6.9(supports-color@6.1.0) + escape-html: 1.0.3 + http-errors: 1.6.3 + mime-types: 2.1.35 + parseurl: 1.3.3 + transitivePeerDependencies: + - supports-color + dev: true + + /serve-static@1.15.0(supports-color@6.1.0): + resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} + engines: {node: '>= 0.8.0'} + dependencies: + encodeurl: 1.0.2 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 0.18.0(supports-color@6.1.0) + transitivePeerDependencies: + - supports-color + dev: true + + /set-blocking@2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + + /set-function-length@1.1.1: + resolution: {integrity: sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.1 + get-intrinsic: 1.2.2 + gopd: 1.0.1 + has-property-descriptors: 1.0.1 + + /set-function-name@2.0.1: + resolution: {integrity: sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.1 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.1 + dev: true + + /set-value@2.0.1: + resolution: {integrity: sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==} + engines: {node: '>=0.10.0'} + dependencies: + extend-shallow: 2.0.1 + is-extendable: 0.1.1 + is-plain-object: 2.0.4 + split-string: 3.1.0 + + /setimmediate@1.0.5: + resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} + + /setprototypeof@1.1.0: + resolution: {integrity: sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==} + dev: true + + /setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + dev: true + + /sha.js@2.4.11: + resolution: {integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==} + hasBin: true + dependencies: + inherits: 2.0.4 + safe-buffer: 5.2.1 + + /shallow-copy@0.0.1: + resolution: {integrity: sha512-b6i4ZpVuUxB9h5gfCxPiusKYkqTMOjEbBs4wMaFbkfia4yFv92UKZ6Df8WXcKbn08JNL/abvg3FnMAOfakDvUw==} + dev: false + + /shebang-command@1.2.0: + resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} + engines: {node: '>=0.10.0'} + dependencies: + shebang-regex: 1.0.0 + + /shebang-regex@1.0.0: + resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} + engines: {node: '>=0.10.0'} + + /shellwords@0.1.1: + resolution: {integrity: sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==} + dev: true + + /should-equal@2.0.0: + resolution: {integrity: sha512-ZP36TMrK9euEuWQYBig9W55WPC7uo37qzAEmbjHz4gfyuXrEUgF8cUvQVO+w+d3OMfPvSRQJ22lSm8MQJ43LTA==} + dependencies: + should-type: 1.4.0 + dev: false + + /should-format@3.0.3: + resolution: {integrity: sha512-hZ58adtulAk0gKtua7QxevgUaXTTXxIi8t41L3zo9AHvjXO1/7sdLECuHeIN2SRtYXpNkmhoUP2pdeWgricQ+Q==} + dependencies: + should-type: 1.4.0 + should-type-adaptors: 1.1.0 + dev: false + + /should-type-adaptors@1.1.0: + resolution: {integrity: sha512-JA4hdoLnN+kebEp2Vs8eBe9g7uy0zbRo+RMcU0EsNy+R+k049Ki+N5tT5Jagst2g7EAja+euFuoXFCa8vIklfA==} + dependencies: + should-type: 1.4.0 + should-util: 1.0.1 + dev: false + + /should-type@1.4.0: + resolution: {integrity: sha512-MdAsTu3n25yDbIe1NeN69G4n6mUnJGtSJHygX3+oN0ZbO3DTiATnf7XnYJdGT42JCXurTb1JI0qOBR65shvhPQ==} + dev: false + + /should-util@1.0.1: + resolution: {integrity: sha512-oXF8tfxx5cDk8r2kYqlkUJzZpDBqVY/II2WhvU0n9Y3XYvAYRmeaf1PvvIvTgPnv4KJ+ES5M0PyDq5Jp+Ygy2g==} + dev: false + + /should@13.2.3: + resolution: {integrity: sha512-ggLesLtu2xp+ZxI+ysJTmNjh2U0TsC+rQ/pfED9bUZZ4DKefP27D+7YJVVTvKsmjLpIi9jAa7itwDGkDDmt1GQ==} + dependencies: + should-equal: 2.0.0 + should-format: 3.0.3 + should-type: 1.4.0 + should-type-adaptors: 1.1.0 + should-util: 1.0.1 + dev: false + + /side-channel@1.0.4: + resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} + dependencies: + call-bind: 1.0.5 + get-intrinsic: 1.2.2 + object-inspect: 1.13.1 + + /signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + dev: true + + /simplex-noise@4.0.1: + resolution: {integrity: sha512-zl/+bdSqW7HJOQ0oDbxrNYaF4F5ik0i7M6YOYmEoIJNtg16NpvWaTTM1Y7oV/7T0jFljawLgYPS81Uu2rsfo1A==} + dev: false + + /slash@1.0.0: + resolution: {integrity: sha512-3TYDR7xWt4dIqV2JauJr+EJeW356RXijHeUlO+8djJ+uBXPn8/2dpzBc8yQhh583sVvc9CvFAeQVgijsH+PNNg==} + engines: {node: '>=0.10.0'} + dev: true + + /slash@2.0.0: + resolution: {integrity: sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==} + engines: {node: '>=6'} + + /slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + /slice-ansi@2.1.0: + resolution: {integrity: sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==} + engines: {node: '>=6'} + dependencies: + ansi-styles: 3.2.1 + astral-regex: 1.0.0 + is-fullwidth-code-point: 2.0.0 + dev: true + + /slugo@0.2.3: + resolution: {integrity: sha512-4nav6mk321IWKaWxgvygjp2JB0d5sNGgkPUJ+EGQZmmcvuXS+4DwdhhPa9L8WBg6fVQDID3PO+t6wYM1NqVbkA==} + dev: false + + /snapdragon-node@2.1.1: + resolution: {integrity: sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==} + engines: {node: '>=0.10.0'} + requiresBuild: true + dependencies: + define-property: 1.0.0 + isobject: 3.0.1 + snapdragon-util: 3.0.1 + + /snapdragon-util@3.0.1: + resolution: {integrity: sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==} + engines: {node: '>=0.10.0'} + requiresBuild: true + dependencies: + kind-of: 3.2.2 + + /snapdragon@0.8.2(supports-color@6.1.0): + resolution: {integrity: sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==} + engines: {node: '>=0.10.0'} + dependencies: + base: 0.11.2 + debug: 2.6.9(supports-color@6.1.0) + define-property: 0.2.5 + extend-shallow: 2.0.1 + map-cache: 0.2.2 + source-map: 0.5.7 + source-map-resolve: 0.5.3 + use: 3.1.1 + transitivePeerDependencies: + - supports-color + + /sockjs-client@1.6.1(supports-color@6.1.0): + resolution: {integrity: sha512-2g0tjOR+fRs0amxENLi/q5TiJTqY+WXFOzb5UwXndlK6TO3U/mirZznpx6w34HVMoc3g7cY24yC/ZMIYnDlfkw==} + engines: {node: '>=12'} + dependencies: + debug: 3.2.7(supports-color@6.1.0) + eventsource: 2.0.2 + faye-websocket: 0.11.4 + inherits: 2.0.4 + url-parse: 1.5.10 + transitivePeerDependencies: + - supports-color + dev: true + + /sockjs@0.3.24: + resolution: {integrity: sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==} + dependencies: + faye-websocket: 0.11.4 + uuid: 8.3.2 + websocket-driver: 0.7.4 + dev: true + + /sort-keys-length@1.0.1: + resolution: {integrity: sha512-GRbEOUqCxemTAk/b32F2xa8wDTs+Z1QHOkbhJDQTvv/6G3ZkbJ+frYWsTcc7cBB3Fu4wy4XlLCuNtJuMn7Gsvw==} + engines: {node: '>=0.10.0'} + dependencies: + sort-keys: 1.1.2 + dev: false + + /sort-keys@1.1.2: + resolution: {integrity: sha512-vzn8aSqKgytVik0iwdBEi+zevbTYZogewTUM6dtpmGwEcdzbub/TX4bCzRhebDCRC3QzXgJsLRKB2V/Oof7HXg==} + engines: {node: '>=0.10.0'} + dependencies: + is-plain-obj: 1.1.0 + + /sort-keys@2.0.0: + resolution: {integrity: sha512-/dPCrG1s3ePpWm6yBbxZq5Be1dXGLyLn9Z791chDC3NFrpkVbWGzkBwPN1knaciexFXgRJ7hzdnwZ4stHSDmjg==} + engines: {node: '>=4'} + dependencies: + is-plain-obj: 1.1.0 + dev: false + + /source-list-map@2.0.1: + resolution: {integrity: sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==} + + /source-map-resolve@0.5.3: + resolution: {integrity: sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==} + deprecated: See https://github.com/lydell/source-map-resolve#deprecated + dependencies: + atob: 2.1.2 + decode-uri-component: 0.2.2 + resolve-url: 0.2.1 + source-map-url: 0.4.1 + urix: 0.1.0 + + /source-map-support@0.4.18: + resolution: {integrity: sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==} + dependencies: + source-map: 0.5.7 + dev: true + + /source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + /source-map-url@0.4.1: + resolution: {integrity: sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==} + deprecated: See https://github.com/lydell/source-map-url#deprecated + + /source-map@0.5.7: + resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} + engines: {node: '>=0.10.0'} + + /source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + /source-map@0.7.4: + resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} + engines: {node: '>= 8'} + dev: true + + /spdx-correct@3.2.0: + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + dependencies: + spdx-expression-parse: 3.0.1 + spdx-license-ids: 3.0.16 + + /spdx-exceptions@2.3.0: + resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==} + + /spdx-expression-parse@3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + dependencies: + spdx-exceptions: 2.3.0 + spdx-license-ids: 3.0.16 + + /spdx-license-ids@3.0.16: + resolution: {integrity: sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==} + + /spdy-transport@3.0.0(supports-color@6.1.0): + resolution: {integrity: sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==} + dependencies: + debug: 4.3.4(supports-color@6.1.0) + detect-node: 2.1.0 + hpack.js: 2.1.6 + obuf: 1.1.2 + readable-stream: 3.6.2 + wbuf: 1.7.3 + transitivePeerDependencies: + - supports-color + dev: true + + /spdy@4.0.2(supports-color@6.1.0): + resolution: {integrity: sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==} + engines: {node: '>=6.0.0'} + dependencies: + debug: 4.3.4(supports-color@6.1.0) + handle-thing: 2.0.1 + http-deceiver: 1.2.7 + select-hose: 2.0.0 + spdy-transport: 3.0.0(supports-color@6.1.0) + transitivePeerDependencies: + - supports-color + dev: true + + /split-string@3.1.0: + resolution: {integrity: sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==} + engines: {node: '>=0.10.0'} + dependencies: + extend-shallow: 3.0.2 + + /sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + + /sshpk@1.18.0: + resolution: {integrity: sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==} + engines: {node: '>=0.10.0'} + hasBin: true + dependencies: + asn1: 0.2.6 + assert-plus: 1.0.0 + bcrypt-pbkdf: 1.0.2 + dashdash: 1.14.1 + ecc-jsbn: 0.1.2 + getpass: 0.1.7 + jsbn: 0.1.1 + safer-buffer: 2.1.2 + tweetnacl: 0.14.5 + + /ssri@5.3.0: + resolution: {integrity: sha512-XRSIPqLij52MtgoQavH/x/dU1qVKtWUAAZeOHsR9c2Ddi4XerFy3mc1alf+dLJKl9EUIm/Ht+EowFkTUOA6GAQ==} + dependencies: + safe-buffer: 5.2.1 + dev: true + + /ssri@6.0.2: + resolution: {integrity: sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==} + dependencies: + figgy-pudding: 3.5.2 + + /ssri@8.0.1: + resolution: {integrity: sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==} + engines: {node: '>= 8'} + dependencies: + minipass: 3.3.6 + dev: false + + /standardized-audio-context@25.3.61: + resolution: {integrity: sha512-ew5s1DOlSfU/oHtdIbRGhtPriGd2D4ttVY0uB63Ura1bQWG+c0YVFtmy2fBPLcKH5qkIbrHHlwJTikgVsJ62dg==} + dependencies: + '@babel/runtime': 7.23.7 + automation-events: 6.0.13 + tslib: 2.6.2 + dev: false + + /startaudiocontext@1.2.1: + resolution: {integrity: sha512-ooOQhOAoCwzMIRwWd9j7xF8kAMo1Wv7Zfw+q6dWDW5gxJUKx15HJXWDg89GMDqfdle9xsqPv+uioneX+bI643g==} + dev: false + + /static-eval@2.1.1: + resolution: {integrity: sha512-MgWpQ/ZjGieSVB3eOJVs4OA2LT/q1vx98KPCTTQPzq/aLr0YUXTsgryTXr4SLfR0ZfUUCiedM9n/ABeDIyy4mA==} + dependencies: + escodegen: 2.1.0 + dev: false + + /static-extend@0.1.2: + resolution: {integrity: sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==} + engines: {node: '>=0.10.0'} + dependencies: + define-property: 0.2.5 + object-copy: 0.1.0 + + /static-module@2.2.5: + resolution: {integrity: sha512-D8vv82E/Kpmz3TXHKG8PPsCPg+RAX6cbCOyvjM6x04qZtQ47EtJFVwRsdov3n5d6/6ynrOY9XB4JkaZwB2xoRQ==} + dependencies: + concat-stream: 1.6.2 + convert-source-map: 1.9.0 + duplexer2: 0.1.4 + escodegen: 1.9.1 + falafel: 2.2.5 + has: 1.0.4 + magic-string: 0.22.5 + merge-source-map: 1.0.4 + object-inspect: 1.4.1 + quote-stream: 1.0.2 + readable-stream: 2.3.8 + shallow-copy: 0.0.1 + static-eval: 2.1.1 + through2: 2.0.5 + dev: false + + /statuses@1.5.0: + resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} + engines: {node: '>= 0.6'} + dev: true + + /statuses@2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + dev: true + + /stream-browserify@2.0.2: + resolution: {integrity: sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==} + dependencies: + inherits: 2.0.4 + readable-stream: 2.3.8 + + /stream-each@1.2.3: + resolution: {integrity: sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==} + dependencies: + end-of-stream: 1.4.4 + stream-shift: 1.0.1 + + /stream-http@2.8.3: + resolution: {integrity: sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==} + dependencies: + builtin-status-codes: 3.0.0 + inherits: 2.0.4 + readable-stream: 2.3.8 + to-arraybuffer: 1.0.1 + xtend: 4.0.2 + + /stream-shift@1.0.1: + resolution: {integrity: sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==} + + /strict-uri-encode@1.1.0: + resolution: {integrity: sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==} + engines: {node: '>=0.10.0'} + + /string-length@2.0.0: + resolution: {integrity: sha512-Qka42GGrS8Mm3SZ+7cH8UXiIWI867/b/Z/feQSpQx/rbfB8UGknGEZVaUQMOUVj+soY6NpWAxily63HI1OckVQ==} + engines: {node: '>=4'} + dependencies: + astral-regex: 1.0.0 + strip-ansi: 4.0.0 + dev: true + + /string-width@1.0.2: + resolution: {integrity: sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==} + engines: {node: '>=0.10.0'} + dependencies: + code-point-at: 1.1.0 + is-fullwidth-code-point: 1.0.0 + strip-ansi: 3.0.1 + + /string-width@2.1.1: + resolution: {integrity: sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==} + engines: {node: '>=4'} + dependencies: + is-fullwidth-code-point: 2.0.0 + strip-ansi: 4.0.0 + dev: true + + /string-width@3.1.0: + resolution: {integrity: sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==} + engines: {node: '>=6'} + dependencies: + emoji-regex: 7.0.3 + is-fullwidth-code-point: 2.0.0 + strip-ansi: 5.2.0 + + /string.prototype.matchall@4.0.10: + resolution: {integrity: sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + get-intrinsic: 1.2.2 + has-symbols: 1.0.3 + internal-slot: 1.0.6 + regexp.prototype.flags: 1.5.1 + set-function-name: 2.0.1 + side-channel: 1.0.4 + dev: true + + /string.prototype.trim@1.2.8: + resolution: {integrity: sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + dev: true + + /string.prototype.trimend@1.0.7: + resolution: {integrity: sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + dev: true + + /string.prototype.trimstart@1.0.7: + resolution: {integrity: sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + dev: true + + /string_decoder@0.10.31: + resolution: {integrity: sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==} + dev: false + + /string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + dependencies: + safe-buffer: 5.1.2 + + /string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + dependencies: + safe-buffer: 5.2.1 + + /strip-ansi@2.0.1: + resolution: {integrity: sha512-2h8q2CP3EeOhDJ+jd932PRMpa3/pOJFGoF22J1U/DNbEK2gSW2DqeF46VjCXsSQXhC+k/l8/gaaRBQKL6hUPfQ==} + engines: {node: '>=0.10.0'} + hasBin: true + dependencies: + ansi-regex: 1.1.1 + dev: false + + /strip-ansi@3.0.1: + resolution: {integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==} + engines: {node: '>=0.10.0'} + dependencies: + ansi-regex: 2.1.1 + + /strip-ansi@4.0.0: + resolution: {integrity: sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==} + engines: {node: '>=4'} + dependencies: + ansi-regex: 3.0.1 + dev: true + + /strip-ansi@5.2.0: + resolution: {integrity: sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==} + engines: {node: '>=6'} + dependencies: + ansi-regex: 4.1.1 + + /strip-bom@2.0.0: + resolution: {integrity: sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==} + engines: {node: '>=0.10.0'} + dependencies: + is-utf8: 0.2.1 + dev: true + + /strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + dev: true + + /strip-dirs@2.1.0: + resolution: {integrity: sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==} + dependencies: + is-natural-number: 4.0.1 + dev: false + + /strip-eof@1.0.0: + resolution: {integrity: sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==} + engines: {node: '>=0.10.0'} + dev: true + + /strip-json-comments@2.0.1: + resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} + engines: {node: '>=0.10.0'} + dev: true + + /strip-outer@1.0.1: + resolution: {integrity: sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==} + engines: {node: '>=0.10.0'} + dependencies: + escape-string-regexp: 1.0.5 + + /strip-url-auth@1.0.1: + resolution: {integrity: sha512-++41PnXftlL3pvI6lpvhSEO+89g1kIJC4MYB5E6yH+WHa5InIqz51yGd1YOGd7VNSNdoEOfzTMqbAM/2PbgaHQ==} + engines: {node: '>=0.10.0'} + dev: true + + /style-loader@0.23.1: + resolution: {integrity: sha512-XK+uv9kWwhZMZ1y7mysB+zoihsEj4wneFWAS5qoiLwzW0WzSqMrrsIy+a3zkQJq0ipFtBpX5W3MqyRIBF/WFGg==} + engines: {node: '>= 0.12.0'} + dependencies: + loader-utils: 1.4.2 + schema-utils: 1.0.0 + dev: false + + /supports-color@2.0.0: + resolution: {integrity: sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==} + engines: {node: '>=0.8.0'} + + /supports-color@3.2.3: + resolution: {integrity: sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==} + engines: {node: '>=0.8.0'} + dependencies: + has-flag: 1.0.0 + dev: true + + /supports-color@4.4.0: + resolution: {integrity: sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==} + engines: {node: '>=4'} + dependencies: + has-flag: 2.0.0 + dev: false + + /supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + dependencies: + has-flag: 3.0.0 + + /supports-color@6.1.0: + resolution: {integrity: sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==} + engines: {node: '>=6'} + dependencies: + has-flag: 3.0.0 + + /supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + /symbol-observable@1.2.0: + resolution: {integrity: sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==} + engines: {node: '>=0.10.0'} + dev: false + + /symbol-tree@3.2.4: + resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + dev: true + + /table@5.4.6: + resolution: {integrity: sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==} + engines: {node: '>=6.0.0'} + dependencies: + ajv: 6.12.6 + lodash: 4.17.21 + slice-ansi: 2.1.0 + string-width: 3.1.0 + dev: true + + /tapable@0.1.10: + resolution: {integrity: sha512-jX8Et4hHg57mug1/079yitEKWGB3LCwoxByLsNim89LABq8NqgiX+6iYVOsq0vX8uJHkU+DZ5fnq95f800bEsQ==} + engines: {node: '>=0.6'} + dev: true + + /tapable@1.1.3: + resolution: {integrity: sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==} + engines: {node: '>=6'} + + /tar-stream@1.6.2: + resolution: {integrity: sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==} + engines: {node: '>= 0.8.0'} + dependencies: + bl: 1.2.3 + buffer-alloc: 1.2.0 + end-of-stream: 1.4.4 + fs-constants: 1.0.0 + readable-stream: 2.3.8 + to-buffer: 1.1.1 + xtend: 4.0.2 + dev: false + + /tar@6.2.0: + resolution: {integrity: sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==} + engines: {node: '>=10'} + dependencies: + chownr: 2.0.0 + fs-minipass: 2.1.0 + minipass: 5.0.0 + minizlib: 2.1.2 + mkdirp: 1.0.3 + yallist: 4.0.0 + dev: false + + /tcp-port-used@1.0.2: + resolution: {integrity: sha512-l7ar8lLUD3XS1V2lfoJlCBaeoaWo/2xfYt81hM7VlvR4RrMVFqfmzfhLVk40hAb368uitje5gPtBRL1m/DGvLA==} + dependencies: + debug: 4.3.1 + is2: 2.0.9 + transitivePeerDependencies: + - supports-color + dev: true + + /terser-webpack-plugin@1.4.5(webpack@4.46.0): + resolution: {integrity: sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==} + engines: {node: '>= 6.9.0'} + peerDependencies: + webpack: ^4.0.0 + dependencies: + cacache: 12.0.4 + 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.8.1 + webpack: 4.46.0(webpack-cli@3.3.12) + webpack-sources: 1.4.3 + worker-farm: 1.7.0 + + /terser@4.8.1: + resolution: {integrity: sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + acorn: 8.11.3 + commander: 2.20.3 + source-map: 0.6.1 + source-map-support: 0.5.21 + + /test-exclude@4.2.3: + resolution: {integrity: sha512-SYbXgY64PT+4GAL2ocI3HwPa4Q4TBKm0cwAVeKOt/Aoc0gSpNRjJX8w0pA1LMKZ3LBmd8pYBqApFNQLII9kavA==} + dependencies: + arrify: 1.0.1 + micromatch: 2.3.11 + object-assign: 4.1.1 + read-pkg-up: 1.0.1 + require-main-filename: 1.0.1 + dev: true + + /text-encoding@0.7.0: + resolution: {integrity: sha512-oJQ3f1hrOnbRLOcwKz0Liq2IcrvDeZRHXhd9RgLrsT+DjWY/nty1Hi7v3dtkaEYbPYe0mUoOfzRrMwfXXwgPUA==} + deprecated: no longer maintained + dev: false + + /text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + dev: true + + /three-mesh-bvh@0.6.0(three@0.153.0): + resolution: {integrity: sha512-4/oXeqVMLuN9/P0M3L5ezIVrFiXQXKvjVTErkiSYMjSaPoWfNPAwqulSgLf4bIUPn8/Lq3rmIJwxbCuD8qDobA==} + peerDependencies: + three: '>= 0.151.0' + dependencies: + three: 0.153.0 + dev: false + + /three@0.153.0: + resolution: {integrity: sha512-OCP2/uQR6GcDpSLnJt/3a4mdS0kNWcbfUXIwLoEMgLzEUIVIYsSDwskpmOii/AkDM+BBwrl6+CKgrjX9+E2aWg==} + dev: false + + /throat@4.1.0: + resolution: {integrity: sha512-wCVxLDcFxw7ujDxaeJC6nfl2XfHJNYs8yUYJnvMgtPEFlttP9tHSfRUv2vBe6C4hkVFPWoP1P6ZccbYjmSEkKA==} + dev: true + + /through2@2.0.5: + resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} + dependencies: + readable-stream: 2.3.8 + xtend: 4.0.2 + + /through@2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + + /thunky@1.1.0: + resolution: {integrity: sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==} + dev: true + + /timed-out@4.0.1: + resolution: {integrity: sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA==} + engines: {node: '>=0.10.0'} + dev: false + + /timers-browserify@2.0.12: + resolution: {integrity: sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==} + engines: {node: '>=0.6.0'} + dependencies: + setimmediate: 1.0.5 + + /tiny-emitter@2.1.0: + resolution: {integrity: sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==} + dev: false + + /tiny-inflate@1.0.3: + resolution: {integrity: sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==} + dev: false + + /tmp@0.0.30: + resolution: {integrity: sha512-HXdTB7lvMwcb55XFfrTM8CPr/IYREk4hVBFaQ4b/6nInrluSL86hfHm7vu0luYKCfyBZp2trCjpc8caC3vVM3w==} + engines: {node: '>=0.4.0'} + dependencies: + os-tmpdir: 1.0.2 + dev: true + + /tmp@0.0.33: + resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} + engines: {node: '>=0.6.0'} + dependencies: + os-tmpdir: 1.0.2 + dev: true + + /tmpl@1.0.5: + resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} + dev: true + + /to-arraybuffer@1.0.1: + resolution: {integrity: sha512-okFlQcoGTi4LQBG/PgSYblw9VOyptsz2KJZqc6qtgGdes8VktzUQkj4BI2blit072iS8VODNcMA+tvnS9dnuMA==} + + /to-buffer@1.1.1: + resolution: {integrity: sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==} + dev: false + + /to-fast-properties@1.0.3: + resolution: {integrity: sha512-lxrWP8ejsq+7E3nNjwYmUBMAgjMTZoTI+sdBOpvNyijeDLa29LUn9QaoXAHv4+Z578hbmHHJKZknzxVtvo77og==} + engines: {node: '>=0.10.0'} + dev: true + + /to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + + /to-object-path@0.3.0: + resolution: {integrity: sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==} + engines: {node: '>=0.10.0'} + dependencies: + kind-of: 3.2.2 + + /to-regex-range@2.1.1: + resolution: {integrity: sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==} + engines: {node: '>=0.10.0'} + requiresBuild: true + dependencies: + is-number: 3.0.0 + repeat-string: 1.6.1 + + /to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + requiresBuild: true + dependencies: + is-number: 7.0.0 + + /to-regex@3.0.2: + resolution: {integrity: sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==} + engines: {node: '>=0.10.0'} + dependencies: + define-property: 2.0.2 + extend-shallow: 3.0.2 + regex-not: 1.0.2 + safe-regex: 1.1.0 + + /to-style@1.3.3: + resolution: {integrity: sha512-9K8KYegr9hrdm8yPpu5iZjJp5t6RPAp4gFDU5hD9zR8hwqgF4fsoSitMtkRKQG2qkP5j/uG3wajbgV09rjmIqg==} + dev: false + + /toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + dev: true + + /tone@14.7.77: + resolution: {integrity: sha512-tCfK73IkLHyzoKUvGq47gyDyxiKLFvKiVCOobynGgBB9Dl0NkxTM2p+eRJXyCYrjJwy9Y0XCMqD3uOYsYt2Fdg==} + dependencies: + standardized-audio-context: 25.3.61 + tslib: 2.6.2 + dev: false + + /tough-cookie@2.5.0: + resolution: {integrity: sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==} + engines: {node: '>=0.8'} + dependencies: + psl: 1.9.0 + punycode: 2.3.1 + + /tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + dev: true + + /transformation-matrix@1.15.0: + resolution: {integrity: sha512-808EqPQbmUD6/IMpWUXLOZcblCHf9xaiB+un0RYNNE9+6VRjoiw6Be8R32tZ0ips1PX/15tlnA2Ev4UUgg827Q==} + dev: false + + /transifex@1.6.6: + resolution: {integrity: sha512-uHeRvhfLfZN+JdH+X0zR1jkQAbMGkgExZgcXm31CzaVVd4kq98YaPr4MCgCU0LwA7cgOuB97d2HZQ/WikOAxlg==} + engines: {node: '>=8.9.0'} + hasBin: true + dependencies: + commander: 2.20.3 + lodash: 4.17.21 + mkpath: 1.0.0 + mocha: 4.1.0 + request: 2.88.2 + should: 13.2.3 + dev: false + + /trim-repeated@1.0.0: + resolution: {integrity: sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg==} + engines: {node: '>=0.10.0'} + dependencies: + escape-string-regexp: 1.0.5 + + /trim-right@1.0.1: + resolution: {integrity: sha512-WZGXGstmCWgeevgTL54hrCuw1dyMQIzWy7ZfqRJfSmJZBwklI15egmQytFP6bPidmw3M8d5yEowl1niq4vmqZw==} + engines: {node: '>=0.10.0'} + dev: true + + /tsconfig-paths@3.15.0: + resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} + dependencies: + '@types/json5': 0.0.29 + json5: 1.0.2 + minimist: 1.2.8 + strip-bom: 3.0.0 + dev: true + + /tslib@1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + dev: true + + /tslib@2.6.2: + resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + + /tty-browserify@0.0.0: + resolution: {integrity: sha512-JVa5ijo+j/sOoHGjw0sxw734b1LhBkQ3bvUGNdxnVXDCX81Yx7TFgnZygxrIIWn23hbfTaMYLwRmAxFyDuFmIw==} + + /tunnel-agent@0.6.0: + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + dependencies: + safe-buffer: 5.2.1 + + /tweetnacl@0.14.5: + resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==} + + /twgl.js@4.4.0: + resolution: {integrity: sha512-W+uFP2DyK2dNhE38PcpituNi8CBm+YO5gY6o/IWEILT7NNDTT1wo3YcMmydwiCfUbnT7tz+EcjV7KlZLgE1PlQ==} + dev: false + + /type-check@0.3.2: + resolution: {integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.1.2 + + /type-is@1.6.18: + resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} + engines: {node: '>= 0.6'} + dependencies: + media-typer: 0.3.0 + mime-types: 2.1.35 + dev: true + + /typed-array-buffer@1.0.0: + resolution: {integrity: sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + get-intrinsic: 1.2.2 + is-typed-array: 1.1.12 + dev: true + + /typed-array-byte-length@1.0.0: + resolution: {integrity: sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + for-each: 0.3.3 + has-proto: 1.0.1 + is-typed-array: 1.1.12 + dev: true + + /typed-array-byte-offset@1.0.0: + resolution: {integrity: sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.5 + call-bind: 1.0.5 + for-each: 0.3.3 + has-proto: 1.0.1 + is-typed-array: 1.1.12 + dev: true + + /typed-array-length@1.0.4: + resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} + dependencies: + call-bind: 1.0.5 + for-each: 0.3.3 + is-typed-array: 1.1.12 + dev: true + + /typed-function@4.1.1: + resolution: {integrity: sha512-Pq1DVubcvibmm8bYcMowjVnnMwPVMeh0DIdA8ad8NZY2sJgapANJmiigSUwlt+EgXxpfIv8MWrQXTIzkfYZLYQ==} + engines: {node: '>= 14'} + dev: false + + /typedarray@0.0.6: + resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} + + /ua-parser-js@0.7.37: + resolution: {integrity: sha512-xV8kqRKM+jhMvcHWUKthV9fNebIzrNy//2O9ZwWcfiBFR5f25XVZPLlEajk/sf3Ra15V92isyQqnIEXRDaZWEA==} + dev: true + + /uglify-es@3.3.9: + resolution: {integrity: sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ==} + engines: {node: '>=0.8.0'} + deprecated: support for ECMAScript is superseded by `uglify-js` as of v3.13.0 + hasBin: true + dependencies: + commander: 2.13.0 + source-map: 0.6.1 + dev: true + + /uglify-js@3.17.4: + resolution: {integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==} + engines: {node: '>=0.8.0'} + hasBin: true + requiresBuild: true + dev: true + optional: true + + /uglifyjs-webpack-plugin@1.3.0(webpack@4.46.0): + resolution: {integrity: sha512-ovHIch0AMlxjD/97j9AYovZxG5wnHOPkL7T1GKochBADp/Zwc44pEWNqpKl1Loupp1WhFg7SlYmHZRUfdAacgw==} + engines: {node: '>= 4.8 < 5.0.0 || >= 5.10'} + peerDependencies: + webpack: ^2.0.0 || ^3.0.0 || ^4.0.0 + dependencies: + cacache: 10.0.4 + find-cache-dir: 1.0.0 + schema-utils: 0.4.7 + serialize-javascript: 1.9.1 + source-map: 0.6.1 + uglify-es: 3.3.9 + webpack: 4.46.0(webpack-cli@3.3.12) + webpack-sources: 1.4.3 + worker-farm: 1.7.0 + dev: true + + /unbox-primitive@1.0.2: + resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + dependencies: + call-bind: 1.0.5 + has-bigints: 1.0.2 + has-symbols: 1.0.3 + which-boxed-primitive: 1.0.2 + dev: true + + /unbzip2-stream@1.4.3: + resolution: {integrity: sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==} + dependencies: + buffer: 5.7.1 + through: 2.3.8 + dev: false + + /undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + + /unicode-canonical-property-names-ecmascript@2.0.0: + resolution: {integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==} + engines: {node: '>=4'} + dev: true + + /unicode-match-property-ecmascript@2.0.0: + resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} + engines: {node: '>=4'} + dependencies: + unicode-canonical-property-names-ecmascript: 2.0.0 + unicode-property-aliases-ecmascript: 2.1.0 + dev: true + + /unicode-match-property-value-ecmascript@2.1.0: + resolution: {integrity: sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==} + engines: {node: '>=4'} + dev: true + + /unicode-property-aliases-ecmascript@2.1.0: + resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==} + engines: {node: '>=4'} + dev: true + + /unicode-trie@0.3.1: + resolution: {integrity: sha512-WgVuO0M2jDl7hVfbPgXv2LUrD81HM0bQj/bvLGiw6fJ4Zo8nNFnDrA0/hU2Te/wz6pjxCm5cxJwtLjo2eyV51Q==} + dependencies: + pako: 0.2.9 + tiny-inflate: 1.0.3 + dev: false + + /union-value@1.0.1: + resolution: {integrity: sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==} + engines: {node: '>=0.10.0'} + dependencies: + arr-union: 3.1.0 + get-value: 2.0.6 + is-extendable: 0.1.1 + set-value: 2.0.1 + + /unique-filename@1.1.1: + resolution: {integrity: sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==} + dependencies: + unique-slug: 2.0.2 + + /unique-slug@2.0.2: + resolution: {integrity: sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==} + dependencies: + imurmurhash: 0.1.4 + + /universalify@0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} + + /unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + dev: true + + /unset-value@1.0.0: + resolution: {integrity: sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==} + engines: {node: '>=0.10.0'} + dependencies: + has-value: 0.3.1 + isobject: 3.0.1 + + /upath@1.2.0: + resolution: {integrity: sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==} + engines: {node: '>=4'} + + /update-browserslist-db@1.0.13(browserslist@4.22.2): + resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + dependencies: + browserslist: 4.22.2 + escalade: 3.1.1 + picocolors: 1.0.0 + + /uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + dependencies: + punycode: 2.3.1 + + /urix@0.1.0: + resolution: {integrity: sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==} + deprecated: Please see https://github.com/lydell/urix#deprecated + + /url-loader@4.1.1(file-loader@2.0.0)(webpack@4.46.0): + resolution: {integrity: sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==} + engines: {node: '>= 10.13.0'} + peerDependencies: + file-loader: '*' + webpack: ^4.0.0 || ^5.0.0 + peerDependenciesMeta: + file-loader: + optional: true + dependencies: + file-loader: 2.0.0(webpack@4.46.0) + loader-utils: 2.0.4 + mime-types: 2.1.35 + schema-utils: 3.3.0 + webpack: 4.46.0(webpack-cli@3.3.12) + dev: true + + /url-parse-lax@3.0.0: + resolution: {integrity: sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ==} + engines: {node: '>=4'} + dependencies: + prepend-http: 2.0.0 + dev: false + + /url-parse@1.5.10: + resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} + dependencies: + querystringify: 2.2.0 + requires-port: 1.0.0 + dev: true + + /url-to-options@1.0.1: + resolution: {integrity: sha512-0kQLIzG4fdk/G5NONku64rSH/x32NOA39LVQqlK8Le6lvTF6GGRJpqaQFGgU+CLwySIqBSMdwYM0sYcW9f6P4A==} + engines: {node: '>= 4'} + dev: false + + /url@0.11.3: + resolution: {integrity: sha512-6hxOLGfZASQK/cijlZnZJTq8OXAkt/3YGfQX45vvMYXpZoo8NdWZcY73K108Jf759lS1Bv/8wXnHDTSz17dSRw==} + dependencies: + punycode: 1.4.1 + qs: 6.11.2 + + /use@3.1.1: + resolution: {integrity: sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==} + engines: {node: '>=0.10.0'} + + /util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + /util.promisify@1.0.0: + resolution: {integrity: sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==} + dependencies: + define-properties: 1.2.1 + object.getownpropertydescriptors: 2.1.7 + dev: true + + /util@0.10.4: + resolution: {integrity: sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==} + dependencies: + inherits: 2.0.3 + + /util@0.11.1: + resolution: {integrity: sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==} + dependencies: + inherits: 2.0.3 + + /utila@0.4.0: + resolution: {integrity: sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==} + dev: true + + /utils-merge@1.0.1: + resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} + engines: {node: '>= 0.4.0'} + dev: true + + /uuid@3.4.0: + resolution: {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. + hasBin: true + + /uuid@8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + hasBin: true + dev: true + + /v8-compile-cache@2.4.0: + resolution: {integrity: sha512-ocyWc3bAHBB/guyqJQVI5o4BZkPhznPYUG2ea80Gond/BgNWpap8TOmLSeeQG7bnh2KMISxskdADG59j7zruhw==} + + /validate-npm-package-license@3.0.4: + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + dependencies: + spdx-correct: 3.2.0 + spdx-expression-parse: 3.0.1 + + /vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + dev: true + + /verror@1.10.0: + resolution: {integrity: sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==} + engines: {'0': node >=0.6.0} + dependencies: + assert-plus: 1.0.0 + core-util-is: 1.0.2 + extsprintf: 1.3.0 + + /vlq@0.2.3: + resolution: {integrity: sha512-DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow==} + dev: false + + /vm-browserify@1.1.2: + resolution: {integrity: sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==} + + /walker@1.0.8: + resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} + dependencies: + makeerror: 1.0.12 + dev: true + + /warning@4.0.3: + resolution: {integrity: sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==} + dependencies: + loose-envify: 1.4.0 + dev: false + + /watch@0.18.0: + resolution: {integrity: sha512-oUcoHFG3UF2pBlHcMORAojsN09BfqSfWYWlR3eSSjUFR7eBEx53WT2HX/vZeVTTIVCGShcazb+t6IcBRCNXqvA==} + engines: {node: '>=0.1.95'} + hasBin: true + dependencies: + exec-sh: 0.2.2 + minimist: 1.2.8 + dev: true + + /watchpack-chokidar2@2.0.1: + resolution: {integrity: sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww==} + requiresBuild: true + dependencies: + chokidar: 2.1.8(supports-color@6.1.0) + transitivePeerDependencies: + - supports-color + optional: true + + /watchpack@1.7.5: + resolution: {integrity: sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==} + dependencies: + graceful-fs: 4.2.11 + neo-async: 2.6.2 + optionalDependencies: + chokidar: 3.5.3 + watchpack-chokidar2: 2.0.1 + transitivePeerDependencies: + - supports-color + + /wav-encoder@1.3.0: + resolution: {integrity: sha512-FXJdEu2qDOI+wbVYZpu21CS1vPEg5NaxNskBr4SaULpOJMrLE6xkH8dECa7PiS+ZoeyvP7GllWUAxPN3AvFSEw==} + dev: false + + /wbuf@1.7.3: + resolution: {integrity: sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==} + dependencies: + minimalistic-assert: 1.0.1 + dev: true + + /web-audio-test-api@0.5.2: + resolution: {integrity: sha512-RevLfVjp+wwe/dBPe361IpmNpeXXW6JVmlp8dk0YIxLwAh7evn6JpEQQalVgX4PH/jA8tpLpjD/8tFNUYTf88w==} + dev: true + + /webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + dev: true + + /webidl-conversions@4.0.2: + resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} + dev: true + + /webpack-cli@3.3.12(webpack@4.46.0): + resolution: {integrity: sha512-NVWBaz9k839ZH/sinurM+HcDvJOTXwSjYp1ku+5XKeOC03z8v5QitnK/x+lAxGXFyhdayoIf/GOpv85z3/xPag==} + engines: {node: '>=6.11.5'} + hasBin: true + peerDependencies: + webpack: 4.x.x + dependencies: + chalk: 2.4.2 + cross-spawn: 6.0.5 + enhanced-resolve: 4.5.0 + findup-sync: 3.0.0(supports-color@6.1.0) + global-modules: 2.0.0 + import-local: 2.0.0 + interpret: 1.4.0 + loader-utils: 1.4.2 + supports-color: 6.1.0 + v8-compile-cache: 2.4.0 + webpack: 4.46.0(webpack-cli@3.3.12) + yargs: 13.3.2 + + /webpack-dev-middleware@3.7.3(webpack@4.46.0): + resolution: {integrity: sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ==} + engines: {node: '>= 6'} + peerDependencies: + webpack: ^4.0.0 || ^5.0.0 + dependencies: + memory-fs: 0.4.1 + mime: 2.6.0 + mkdirp: 0.5.6 + range-parser: 1.2.1 + webpack: 4.46.0(webpack-cli@3.3.12) + webpack-log: 2.0.0 + dev: true + + /webpack-dev-server@3.11.2(webpack-cli@3.3.12)(webpack@4.46.0): + resolution: {integrity: sha512-A80BkuHRQfCiNtGBS1EMf2ChTUs0x+B3wGDFmOeT4rmJOHhHTCH2naNxIHhmkr0/UillP4U3yeIyv1pNp+QDLQ==} + engines: {node: '>= 6.11.5'} + hasBin: true + peerDependencies: + webpack: ^4.0.0 || ^5.0.0 + webpack-cli: '*' + peerDependenciesMeta: + webpack-cli: + optional: true + dependencies: + ansi-html: 0.0.7 + bonjour: 3.5.0 + chokidar: 2.1.8(supports-color@6.1.0) + compression: 1.7.4(supports-color@6.1.0) + connect-history-api-fallback: 1.6.0 + debug: 4.3.4(supports-color@6.1.0) + del: 4.1.1 + express: 4.18.2(supports-color@6.1.0) + html-entities: 1.4.0 + http-proxy-middleware: 0.19.1(debug@4.3.4)(supports-color@6.1.0) + import-local: 2.0.0 + internal-ip: 4.3.0 + ip: 1.1.8 + is-absolute-url: 3.0.3 + killable: 1.0.1 + loglevel: 1.8.1 + opn: 5.5.0 + p-retry: 3.0.1 + portfinder: 1.0.32(supports-color@6.1.0) + schema-utils: 1.0.0 + selfsigned: 1.10.14 + semver: 6.3.1 + serve-index: 1.9.1(supports-color@6.1.0) + sockjs: 0.3.24 + sockjs-client: 1.6.1(supports-color@6.1.0) + spdy: 4.0.2(supports-color@6.1.0) + strip-ansi: 3.0.1 + supports-color: 6.1.0 + url: 0.11.3 + webpack: 4.46.0(webpack-cli@3.3.12) + webpack-cli: 3.3.12(webpack@4.46.0) + webpack-dev-middleware: 3.7.3(webpack@4.46.0) + webpack-log: 2.0.0 + ws: 6.2.2 + yargs: 13.3.2 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: true + + /webpack-log@2.0.0: + resolution: {integrity: sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==} + engines: {node: '>= 6'} + dependencies: + ansi-colors: 3.2.4 + uuid: 3.4.0 + dev: true + + /webpack-sources@1.4.3: + resolution: {integrity: sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==} + dependencies: + source-list-map: 2.0.1 + source-map: 0.6.1 + + /webpack-sources@3.2.3: + resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} + engines: {node: '>=10.13.0'} + dev: true + + /webpack@4.46.0(webpack-cli@3.3.12): + resolution: {integrity: sha512-6jJuJjg8znb/xRItk7bkT0+Q7AHCYjjFnvKIWQPkNIOyRqoCGvkOs0ipeQzrqz4l5FtN5ZI/ukEHroeX/o1/5Q==} + engines: {node: '>=6.11.5'} + hasBin: true + peerDependencies: + webpack-cli: '*' + webpack-command: '*' + peerDependenciesMeta: + webpack-cli: + optional: true + webpack-command: + optional: 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.2 + ajv: 6.12.6 + ajv-keywords: 3.5.2(ajv@6.12.6) + chrome-trace-event: 1.0.3 + 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.4.2 + memory-fs: 0.4.1 + micromatch: 3.1.10(supports-color@6.1.0) + mkdirp: 0.5.6 + neo-async: 2.6.2 + node-libs-browser: 2.2.1 + schema-utils: 1.0.0 + tapable: 1.1.3 + terser-webpack-plugin: 1.4.5(webpack@4.46.0) + watchpack: 1.7.5 + webpack-cli: 3.3.12(webpack@4.46.0) + webpack-sources: 1.4.3 + transitivePeerDependencies: + - supports-color + + /websocket-driver@0.7.4: + resolution: {integrity: sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==} + engines: {node: '>=0.8.0'} + dependencies: + http-parser-js: 0.5.8 + safe-buffer: 5.2.1 + websocket-extensions: 0.1.4 + dev: true + + /websocket-extensions@0.1.4: + resolution: {integrity: sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==} + engines: {node: '>=0.8.0'} + dev: true + + /whatwg-encoding@1.0.5: + resolution: {integrity: sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==} + dependencies: + iconv-lite: 0.4.24 + dev: true + + /whatwg-fetch@3.6.20: + resolution: {integrity: sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==} + dev: true + + /whatwg-url@4.8.0: + resolution: {integrity: sha512-nUvUPuenPFtPfy/X+dAYh/TfRbTBlnXTM5iIfLseJFkkQewmpG9pGR6i87E9qL+lZaJzv+99kkQWoGOtLfkZQQ==} + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + dev: true + + /which-boxed-primitive@1.0.2: + resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + dependencies: + is-bigint: 1.0.4 + is-boolean-object: 1.1.2 + is-number-object: 1.0.7 + is-string: 1.0.7 + is-symbol: 1.0.4 + dev: true + + /which-module@2.0.1: + resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} + + /which-typed-array@1.1.13: + resolution: {integrity: sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.5 + call-bind: 1.0.5 + for-each: 0.3.3 + gopd: 1.0.1 + has-tostringtag: 1.0.0 + dev: true + + /which@1.3.1: + resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} + hasBin: true + dependencies: + isexe: 2.0.0 + + /window-size@0.1.4: + resolution: {integrity: sha512-2thx4pB0cV3h+Bw7QmMXcEbdmOzv9t0HFplJH/Lz6yu60hXYy5RT8rUu+wlIreVxWsGN20mo+MHeCSfUpQBwPw==} + engines: {node: '>= 0.10.0'} + hasBin: true + dev: false + + /word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + /wordwrap@1.0.0: + resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} + dev: true + + /worker-farm@1.7.0: + resolution: {integrity: sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==} + dependencies: + errno: 0.1.8 + + /worker-loader@1.1.1(webpack@4.46.0): + resolution: {integrity: sha512-qJZLVS/jMCBITDzPo/RuweYSIG8VJP5P67mP/71alGyTZRe1LYJFdwLjLalY3T5ifx0bMDRD3OB6P2p1escvlg==} + engines: {node: '>= 4.8 < 5.0.0 || >= 5.10'} + peerDependencies: + webpack: ^2.0.0 || ^3.0.0 || ^4.0.0 + dependencies: + loader-utils: 1.4.2 + schema-utils: 0.4.7 + webpack: 4.46.0(webpack-cli@3.3.12) + dev: false + + /worker-loader@2.0.0(webpack@4.46.0): + resolution: {integrity: sha512-tnvNp4K3KQOpfRnD20m8xltE3eWh89Ye+5oj7wXEEHKac1P4oZ6p9oTj8/8ExqoSBnk9nu5Pr4nKfQ1hn2APJw==} + engines: {node: '>= 6.9.0 || >= 8.9.0'} + peerDependencies: + webpack: ^3.0.0 || ^4.0.0-alpha.0 || ^4.0.0 + dependencies: + loader-utils: 1.4.2 + schema-utils: 0.4.7 + webpack: 4.46.0(webpack-cli@3.3.12) + dev: false + + /wrap-ansi@2.1.0: + resolution: {integrity: sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==} + engines: {node: '>=0.10.0'} + dependencies: + string-width: 1.0.2 + strip-ansi: 3.0.1 + + /wrap-ansi@5.1.0: + resolution: {integrity: sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==} + engines: {node: '>=6'} + dependencies: + ansi-styles: 3.2.1 + string-width: 3.1.0 + strip-ansi: 5.2.0 + + /wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + /write-file-atomic@2.4.3: + resolution: {integrity: sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==} + dependencies: + graceful-fs: 4.2.11 + imurmurhash: 0.1.4 + signal-exit: 3.0.7 + dev: true + + /write@1.0.3: + resolution: {integrity: sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==} + engines: {node: '>=4'} + dependencies: + mkdirp: 0.5.6 + dev: true + + /ws@6.2.2: + resolution: {integrity: sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + dependencies: + async-limiter: 1.0.1 + dev: true + + /xhr@2.5.0: + resolution: {integrity: sha512-4nlO/14t3BNUZRXIXfXe+3N6w3s1KoxcJUUURctd64BLRe67E4gRwp4PjywtDY72fXpZ1y6Ch0VZQRY/gMPzzQ==} + dependencies: + global: 4.3.2 + is-function: 1.0.2 + parse-headers: 2.0.5 + xtend: 4.0.2 + dev: false + + /xml-name-validator@2.0.1: + resolution: {integrity: sha512-jRKe/iQYMyVJpzPH+3HL97Lgu5HrCfii+qSo+TfjKHtOnvbnvdVfMYrn9Q34YV81M2e5sviJlI6Ko9y+nByzvA==} + dev: true + + /xml2js@0.4.23: + resolution: {integrity: sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==} + engines: {node: '>=4.0.0'} + dependencies: + sax: 1.3.0 + xmlbuilder: 11.0.1 + dev: true + + /xml@1.0.1: + resolution: {integrity: sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw==} + dev: true + + /xmlbuilder@11.0.1: + resolution: {integrity: sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==} + engines: {node: '>=4.0'} + dev: true + + /xtend@4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} + + /y18n@3.2.2: + resolution: {integrity: sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==} + + /y18n@4.0.3: + resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} + + /yallist@2.1.2: + resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} + dev: true + + /yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + /yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + dev: false + + /yargs-parser@13.1.2: + resolution: {integrity: sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==} + dependencies: + camelcase: 5.3.1 + decamelize: 1.2.0 + + /yargs-parser@7.0.0: + resolution: {integrity: sha512-WhzC+xgstid9MbVUktco/bf+KJG+Uu6vMX0LN1sLJvwmbCQVxb4D8LzogobonKycNasCZLdOzTAk1SK7+K7swg==} + dependencies: + camelcase: 4.1.0 + dev: true + + /yargs@13.3.2: + resolution: {integrity: sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==} + dependencies: + cliui: 5.0.0 + find-up: 3.0.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + require-main-filename: 2.0.0 + set-blocking: 2.0.0 + string-width: 3.1.0 + which-module: 2.0.1 + y18n: 4.0.3 + yargs-parser: 13.1.2 + + /yargs@3.32.0: + resolution: {integrity: sha512-ONJZiimStfZzhKamYvR/xvmgW3uEkAUFSP91y2caTEPhzF6uP2JfPiVZcq66b/YR0C3uitxSV7+T1x8p5bkmMg==} + dependencies: + camelcase: 2.1.1 + cliui: 3.2.0 + decamelize: 1.2.0 + os-locale: 1.4.0 + string-width: 1.0.2 + window-size: 0.1.4 + y18n: 3.2.2 + dev: false + + /yargs@9.0.1: + resolution: {integrity: sha512-XS0NJoM9Iz0azh1cdgfLF5VFK6BSWfrrqA0V2tIx3fV6aGrWCseVDwOkIBg746ev0hes59od5ZvQAfdET4H0pw==} + dependencies: + camelcase: 4.1.0 + cliui: 3.2.0 + decamelize: 1.2.0 + get-caller-file: 1.0.3 + os-locale: 2.1.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.1.1 + which-module: 2.0.1 + y18n: 3.2.2 + yargs-parser: 7.0.0 + dev: true + + /yauzl@2.10.0: + resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} + dependencies: + buffer-crc32: 0.2.13 + fd-slicer: 1.1.0 + + /yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + dev: false + + github.com/FreshPenguin112/gh-pages-webpack-plugin/af8291f79f5e90f62c4f312d1fc5e4a8a2aec5b0: + resolution: {tarball: https://codeload.github.com/FreshPenguin112/gh-pages-webpack-plugin/tar.gz/af8291f79f5e90f62c4f312d1fc5e4a8a2aec5b0} + name: gh-pages-webpack-plugin + version: 1.0.2 + dependencies: + gh-pages: 1.2.0 + dev: true + + github.com/FreshPenguin112/theia-pnpm/13571e769ea006f4061f0eaf316cf3c7d214bad6: + resolution: {tarball: https://codeload.github.com/FreshPenguin112/theia-pnpm/tar.gz/13571e769ea006f4061f0eaf316cf3c7d214bad6} + name: theia + version: 2.1.2 + hasBin: true + dependencies: + chalk: 1.1.3 + inquirer: 0.8.5 + pnpm: 7.33.6 + q: 1.5.1 + yargs: 3.32.0 + dev: false + + github.com/PenguinMod/PenguinMod-Audio/67c441461c16fed75c471abb1213b7b919badb6c: + resolution: {tarball: https://codeload.github.com/PenguinMod/PenguinMod-Audio/tar.gz/67c441461c16fed75c471abb1213b7b919badb6c} + name: scratch-audio + version: 0.1.0 + dependencies: + audio-context: 1.0.1 + minilog: 3.1.0 + startaudiocontext: 1.2.1 + dev: false + + github.com/PenguinMod/PenguinMod-Blocks/898ffafdb69df711e56e3362686badd3e4553bfb: + resolution: {tarball: https://codeload.github.com/PenguinMod/PenguinMod-Blocks/tar.gz/898ffafdb69df711e56e3362686badd3e4553bfb} + name: scratch-blocks + version: 0.1.0 + dev: false + + github.com/PenguinMod/PenguinMod-MarkDown/af23e940551a5ea30f8c6aa118c84a791ecf0f02: + resolution: {tarball: https://codeload.github.com/PenguinMod/PenguinMod-MarkDown/tar.gz/af23e940551a5ea30f8c6aa118c84a791ecf0f02} + name: md + version: 0.6.0 + dependencies: + slugo: 0.2.3 + dev: false + + github.com/PenguinMod/PenguinMod-Paint/e4bd0050300d2597f5037e75ea3697d970e7baf7(react-dom@16.14.0)(react-intl-redux@0.7.0)(react-intl@2.9.0)(react-popover@0.5.10)(react-redux@5.0.7)(react-responsive@4.1.0)(react-style-proptype@3.2.2)(react-tooltip@3.8.0)(react@16.14.0)(redux@3.7.2)(scratch-render-fonts@1.0.0-prerelease.20210401210003): + resolution: {tarball: https://codeload.github.com/PenguinMod/PenguinMod-Paint/tar.gz/e4bd0050300d2597f5037e75ea3697d970e7baf7} + id: github.com/PenguinMod/PenguinMod-Paint/e4bd0050300d2597f5037e75ea3697d970e7baf7 + name: scratch-paint + version: 0.2.0 + 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 + scratch-render-fonts: ^1.0.0-prerelease.20210401210003 + dependencies: + '@scratch/paper': 0.11.20200728195508 + 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.8.1 + react: 16.14.0 + react-dom: 16.14.0(react@16.14.0) + react-intl: 2.9.0(prop-types@15.8.1)(react@16.14.0) + react-intl-redux: 0.7.0(react-intl@2.9.0)(react-redux@5.0.7) + react-popover: 0.5.10 + react-redux: 5.0.7(react@16.14.0)(redux@3.7.2) + react-responsive: 4.1.0(react@16.14.0) + react-style-proptype: 3.2.2 + react-tooltip: 3.8.0(react-dom@16.14.0)(react@16.14.0) + redux: 3.7.2 + scratch-render-fonts: 1.0.0-prerelease.20210401210003 + dev: false + + github.com/PenguinMod/PenguinMod-Parser/c56c7aad93f71aa5d1a126bae1d5e663c161e8eb: + resolution: {tarball: https://codeload.github.com/PenguinMod/PenguinMod-Parser/tar.gz/c56c7aad93f71aa5d1a126bae1d5e663c161e8eb} + name: scratch-parser + version: 0.0.0-development + engines: {node: '>=8.0'} + dependencies: + '@turbowarp/json': 0.1.2 + ajv: 6.3.0 + jszip: 3.1.5 + pify: 4.0.1 + dev: false + + github.com/PenguinMod/PenguinMod-Render/f73221d7efde3d39077470ecb5431bf9a6a33a53(scratch-render-fonts@1.0.0-prerelease.20210401210003): + resolution: {tarball: https://codeload.github.com/PenguinMod/PenguinMod-Render/tar.gz/f73221d7efde3d39077470ecb5431bf9a6a33a53} + id: github.com/PenguinMod/PenguinMod-Render/f73221d7efde3d39077470ecb5431bf9a6a33a53 + name: scratch-render + version: 0.1.0 + peerDependencies: + scratch-render-fonts: ^1.0.0-prerelease + dependencies: + grapheme-breaker: 0.3.2 + hull.js: 0.2.10 + ify-loader: 1.0.4 + linebreak: 0.3.0 + minilog: 3.1.0 + raw-loader: 0.5.1 + scratch-render-fonts: 1.0.0-prerelease.20210401210003 + scratch-svg-renderer: github.com/TurboWarp/scratch-svg-renderer/62fe825405a451ab981c33d601d5c6c3581ced69(scratch-render-fonts@1.0.0-prerelease.20210401210003) + twgl.js: 4.4.0 + dev: false + + github.com/PenguinMod/PenguinMod-Storage/96f45f701dc11648bc88fcc5307193d591afea84(webpack@4.46.0): + resolution: {tarball: https://codeload.github.com/PenguinMod/PenguinMod-Storage/tar.gz/96f45f701dc11648bc88fcc5307193d591afea84} + id: github.com/PenguinMod/PenguinMod-Storage/96f45f701dc11648bc88fcc5307193d591afea84 + name: scratch-storage + version: 0.0.0-development + dependencies: + arraybuffer-loader: 1.0.8 + base64-js: 1.3.0 + fastestsmallesttextencoderdecoder: 1.0.22 + js-md5: 0.7.3 + minilog: 3.1.0 + worker-loader: 2.0.0(webpack@4.46.0) + transitivePeerDependencies: + - webpack + dev: false + + github.com/PenguinMod/PenguinMod-Vm/e4dc0bbbdda4b5546beadd482cd3cbef8c7525c0(@turbowarp/scratch-svg-renderer@1.0.0)(webpack@4.46.0): + resolution: {tarball: https://codeload.github.com/PenguinMod/PenguinMod-Vm/tar.gz/e4dc0bbbdda4b5546beadd482cd3cbef8c7525c0} + id: github.com/PenguinMod/PenguinMod-Vm/e4dc0bbbdda4b5546beadd482cd3cbef8c7525c0 + name: scratch-vm + version: 0.2.0 + peerDependencies: + scratch-svg-renderer: ^0.2.0-prerelease + dependencies: + '@turbowarp/json': 0.1.2 + '@vernier/godirect': 1.5.0 + arraybuffer-loader: 1.0.8 + atob: 2.1.2 + btoa: 1.2.1 + cannon-es: 0.20.0 + canvas-toBlob: 1.0.0 + decode-html: 2.0.0 + diff-match-patch: 1.0.4 + format-message: 6.2.1 + htmlparser2: 3.10.1 + immutable: 3.8.2 + jszip: 3.10.1 + lz-string: 1.5.0 + mathjs: 11.12.0 + mersenne-twister: 1.1.0 + minilog: 3.1.0 + pathfinding: 0.4.18 + scratch-parser: github.com/PenguinMod/PenguinMod-Parser/c56c7aad93f71aa5d1a126bae1d5e663c161e8eb + scratch-sb1-converter: 0.2.7 + scratch-svg-renderer: github.com/TurboWarp/scratch-svg-renderer/62fe825405a451ab981c33d601d5c6c3581ced69(scratch-render-fonts@1.0.0-prerelease.20210401210003) + scratch-translate-extension-languages: 0.0.20191118205314 + simplex-noise: 4.0.1 + text-encoding: 0.7.0 + three: 0.153.0 + three-mesh-bvh: 0.6.0(three@0.153.0) + tone: 14.7.77 + worker-loader: 1.1.1(webpack@4.46.0) + transitivePeerDependencies: + - webpack + dev: false + + github.com/TurboWarp/scratch-svg-renderer/62fe825405a451ab981c33d601d5c6c3581ced69(scratch-render-fonts@1.0.0-prerelease.20210401210003): + resolution: {tarball: https://codeload.github.com/TurboWarp/scratch-svg-renderer/tar.gz/62fe825405a451ab981c33d601d5c6c3581ced69} + id: github.com/TurboWarp/scratch-svg-renderer/62fe825405a451ab981c33d601d5c6c3581ced69 + name: '@turbowarp/scratch-svg-renderer' + version: 1.0.0 + peerDependencies: + scratch-render-fonts: ^1.0.0-prerelease + dependencies: + base64-js: 1.2.1 + base64-loader: 1.0.0 + css-tree: 1.1.3 + dompurify: 2.2.7 + fastestsmallesttextencoderdecoder: 1.0.22 + minilog: 3.1.0 + scratch-render-fonts: 1.0.0-prerelease.20210401210003 + transformation-matrix: 1.15.0 + dev: false diff --git a/prune-gh-pages.sh b/prune-gh-pages.sh new file mode 100644 index 0000000000000000000000000000000000000000..3de6c40e8aa0274fc85d87234af24125253e281a --- /dev/null +++ b/prune-gh-pages.sh @@ -0,0 +1,64 @@ +#!/bin/bash +# gh-pages cleanup script: Switches to gh-pages branch, and removes all +# directories that aren't listed as remote branches + +function deslash () { + # Recursively build a string of a directory's parents. E.g., + # deslashed "feature/test/branch" returns feature/test feature + deslashed=$(dirname $1) + if [[ $deslashed =~ .*/.* ]] + then + echo $deslashed $(deslash $deslashed) + else + echo $deslashed + fi +} + +repository=origin + +if [[ $1 != "" ]] +then + repository=$1 +fi + +# Cache current branch +current=$(git rev-parse --abbrev-ref HEAD) + +# Checkout most recent gh-pages +git fetch --force $repository gh-pages:gh-pages +git checkout gh-pages +git clean -fdx + +# Make an array of directories to not delete, from the list of remote branches +branches=$(git ls-remote --refs --quiet $repository | awk '{print $2}' | sed -e 's/refs\/heads\///') + +# Add parent directories of branches to the exclusion list (e.g. greenkeeper/) +for branch in $branches; do + if [[ $branch =~ .*/.* ]]; then + branches+=" $(deslash $branch)" + fi +done + +# Dedupe all the greenkeepers (or other duplicate parent directories) +branches=$(echo "${branches[@]}" | tr ' ' '\n' | sort -u | tr '\n' ' ') + +# Remove all directories that don't have corresponding branches +# It would be nice if we could exclude everything in .gitignore, but we're +# not on the branch with the .gitignore anymore... so we can't. +find . -type d \ + \( \ + -path ./.git -o \ + -path ./node_modules \ + $(printf " -o -path ./%s" $branches) \ + \) -prune \ + -o -mindepth 1 -type d \ + -exec rm -rfv {} \; + +# Push +git add -u +git commit -m "Remove stale directories" +git push $repository gh-pages + +# Return to where we were +git checkout -f $current +exit diff --git a/renovate.json5 b/renovate.json5 new file mode 100644 index 0000000000000000000000000000000000000000..5615b310dbab76f23ee84ce5281503ac818cfc77 --- /dev/null +++ b/renovate.json5 @@ -0,0 +1,7 @@ +{ + "$schema": "https://docs.renovatebot.com/renovate-schema.json", + + "extends": [ + "github>LLK/scratch-renovate-config:conservative" + ] +} diff --git a/src/.eslintrc.js b/src/.eslintrc.js new file mode 100644 index 0000000000000000000000000000000000000000..967c8bfcb436b875f5cce91422383c3cc6d8a674 --- /dev/null +++ b/src/.eslintrc.js @@ -0,0 +1,38 @@ +const path = require('path'); +module.exports = { + root: true, + extends: ['scratch', 'scratch/es6', 'scratch/react', 'plugin:import/errors'], + env: { + browser: true + }, + globals: { + process: true + }, + rules: { + 'import/no-mutable-exports': 'error', + 'import/no-commonjs': 'error', + 'import/no-amd': 'error', + 'import/no-nodejs-modules': 'error', + 'react/jsx-no-literals': 'error', + 'no-confusing-arrow': ['error', { + 'allowParens': true + }], + 'operator-linebreak': 'off', + 'no-console': 'off', + 'space-before-function-paren': 'off', + 'no-lonely-if': 'off', + 'space-infix-ops': 'off', // so dumb + 'object-curly-spacing': 'off', + 'curly': 'off' + }, + settings: { + react: { + version: '16.2' // Prevent 16.3 lifecycle method errors + }, + 'import/resolver': { + webpack: { + config: path.resolve(__dirname, '../webpack.config.js') + } + } + } +}; diff --git a/src/.gitignore b/src/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..7466331438121319122ad68a411e9fcfe9b297b3 --- /dev/null +++ b/src/.gitignore @@ -0,0 +1,3 @@ +!dist/ +!build/ +#hi diff --git a/src/addons/.gitignore b/src/addons/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..ff8ed621180604b0adc58a23133bd8de22478d58 --- /dev/null +++ b/src/addons/.gitignore @@ -0,0 +1 @@ +ScratchAddons diff --git a/src/addons/README.md b/src/addons/README.md new file mode 100644 index 0000000000000000000000000000000000000000..d684279b516ece5f9bdb6b222c63de88328d15eb --- /dev/null +++ b/src/addons/README.md @@ -0,0 +1,18 @@ +# Addons + +Addons and translations are from the [Scratch Addons browser extension](https://scratchaddons.com/). Feature requests should be sent [upstream](https://github.com/ScratchAddons/ScratchAddons/issues), but bug reports should be opened here first incase it's a bug caused by PenguinMod. + +We apply some patches on top of the original source files. These patches are maintained in https://github.com/TurboWarp/addons. + +entry.js exports a function that begins running addons. + +pull.js is a magical script that automatically pulls code from GitHub, parses it with regex, applies some more automated patches, and copies everything to the proper folders. + +Directory structure: + + - addons - the addons (managed by pull.js) + - addons-l10n - addon translations used at runtime (managed by pull.js) + - addons-l10n-settings - addon translations used by the settings page (managed by pull.js) + - libraries - libraries used by addons (managed by pull.js) + - generated - additional generated files (managed by pull.js) + - settings - the settings page and its translations diff --git a/src/addons/addon-precedence.js b/src/addons/addon-precedence.js new file mode 100644 index 0000000000000000000000000000000000000000..9d29e64a3909e248b98a7b4c0cdcd7325d869951 --- /dev/null +++ b/src/addons/addon-precedence.js @@ -0,0 +1,16 @@ +// This list is a subset of `addons` and defines the order by which addon CSS should +// applied in. Items later in this list are given higher precedence. Addons not listed +// here are implied to have the lowest possible precedence. +const addonPrecedence = [ + 'columns', + 'editor-stage-left', + 'editor-theme3' +]; + +/** + * @param {string} addonId The addon ID + * @returns {number} An integer >= 0 + */ +const getPrecedence = addonId => addonPrecedence.indexOf(addonId) + 1; + +export default getPrecedence; diff --git a/src/addons/addons-l10n-settings/de.json b/src/addons/addons-l10n-settings/de.json new file mode 100644 index 0000000000000000000000000000000000000000..d24bb5f488d6f3cc44a52cd2f11e291a12e5164d --- /dev/null +++ b/src/addons/addons-l10n-settings/de.json @@ -0,0 +1,346 @@ +{ + "cat-blocks/@description": "Fügt die Katzenstartblöcke vom Aprilscherz 2020 wieder zum Editor hinzu.", + "cat-blocks/@info-watch": "Die \"Mauscursor ansehen\"-Option könnte die Leistung beeinträchtigen, wenn der Editor geöffnet ist.", + "cat-blocks/@name": "Katzenblöcke", + "cat-blocks/@settings-name-watch": "Mauscursor ansehen", + "editor-devtools/@description": "Fügt neue Menüoptionen zum Editor hinzu: Blöcke kopieren/einfügen, besseres Aufräumen und mehr!", + "editor-devtools/@name": "Entwicklertools", + "editor-devtools/@settings-name-enableCleanUpPlus": "Verbessere \"Blöcke aufräumen\"", + "editor-devtools/@settings-name-enablePasteBlocksAtMouse": "Blöcke beim Mauscursor einfügen", + "find-bar/@description": "Fügt eine Leiste neben dem Klänge-Tab im Editor hinzu, mit der du Skripte, Kostüme und Klänge durchsuchen kannst. Verwende Strg+Links und Strg+Rechts im Codebereich, um zur vorher bzw. nachher besuchten Position nach Verwendung der Finden-Leiste zu navigieren.", + "find-bar/@info-developer-tools": "Dieses Addon gehörte früher zum \"Entwicklertools\"-Addon, aber es wurde hierher verschoben.", + "find-bar/@name": "Finden-Leiste im Editor", + "middle-click-popup/@description": "Drücke Strg+Leertaste, Umschalt+Leertaste oder klicke mit der mittleren Maustaste auf den Codebereich, um ein schwebendes Eingabefeld hervorzubringen, in dem du den Namen eines Blocks (oder Teile davon) eingeben und in den Codebereich ziehen kannst. Halte die Umschalttaste während des Ziehens gedrückt, um das Popup beim Hinzufügen von mehreren Blöcken geöffnet zu halten.", + "middle-click-popup/@info-developer-tools": "Dieses Addon gehörte früher zum \"Entwicklertools\"-Addon, aber es wurde hierher verschoben.", + "middle-click-popup/@name": "Blöcke mit Namen einfügen", + "jump-to-def/@description": "Ermöglicht das Springen zur Definition eines benutzerdefinierten Blocks durch Klicken mit der mittleren oder rechten Maustaste mit gedrückter Umschalttaste.", + "jump-to-def/@info-developer-tools": "Dieses Addon gehörte früher zum \"Entwicklertools\"-Addon, aber es wurde hierher verschoben.", + "jump-to-def/@name": "Zu Blockdefinition springen", + "editor-searchable-dropdowns/@description": "Ermöglicht es dir, Block-Dropdowns zu durchsuchen.", + "editor-searchable-dropdowns/@name": "Durchsuchbare Dropdown-Menüs", + "data-category-tweaks-v2/@description": "Bietet Optimierungen für die Kategorie Daten (\"Variablen\") im Editor.", + "data-category-tweaks-v2/@name": "Optimierungen für die Datenkategorie", + "data-category-tweaks-v2/@settings-name-moveReportersDown": "Datenblöcke über die Variablenliste bewegen", + "data-category-tweaks-v2/@settings-name-separateListCategory": "Separate Listen-Kategorie", + "data-category-tweaks-v2/@settings-name-separateLocalVariables": "Separate Kategorie für Variablen Nur für diese Figur", + "block-palette-icons/@description": "Fügt Icons innerhalb der Farbigen Kreise, die die Blockkategorien unterscheiden, hinzu.", + "block-palette-icons/@name": "Kategorienicons in Blockpalette", + "hide-flyout/@description": "Blendet die Blockpalette automatisch aus, wenn sich die Maus nicht darüber befindet. Klicke auf das Schlossymbol, um es temporär zu fixieren. Alternativ kannst du den \"Kategorien klicken\"-Modus verwenden.", + "hide-flyout/@info-hoverExplanation": "Der \"Palettenbereich-Hover\"-Modus erweitert nur den angezeigten Bereich. Wenn du Blöcke dort hinziehen willst, ohne dass sie gelöscht werden, verwende einen der anderen Modi.", + "hide-flyout/@name": "Automatisches Ausblenden für Blockpalette", + "hide-flyout/@settings-name-speed": "Animationsgeschwindigkeit", + "hide-flyout/@settings-name-toggle": "Festlegen...", + "hide-flyout/@settings-select-speed-default": "Standard", + "hide-flyout/@settings-select-speed-long": "Langsam", + "hide-flyout/@settings-select-speed-none": "Sofort", + "hide-flyout/@settings-select-speed-short": "Schnell", + "hide-flyout/@settings-select-toggle-category": "Kategorien klicken", + "hide-flyout/@settings-select-toggle-cathover": "Kategorien hovern", + "hide-flyout/@settings-select-toggle-hover": "Hover auf Palettenbereich", + "hide-flyout/@update": "Dieses Addon wurde überarbeitet und viele Fehler wurden behoben.", + "mediarecorder/@description": "Fügt einen \"Aufnehmen\"-Knopf zur Menüleiste im Editor hinzu, mit dem du die Bühne des Projekts aufnehmen kannst.", + "mediarecorder/@name": "Projektvideorekorder", + "drag-drop/@description": "Lässt dich BIlder und Klänge vom Dateimanager zur Figuren-, Kostüm- und Klangliste ziehen. Du kannst auch Textdateien in Listen oder \"frage und warte\"-Felder ziehen.", + "drag-drop/@name": "Drag and Drop-Unterstützung für Dateien", + "drag-drop/@settings-name-use-hd-upload": "HD-Upload verwenden", + "debugger/@settings-name-log_broadcasts": "Nachrichten loggen", + "debugger/@settings-name-log_clear_greenflag": "Logs beim Klicken auf die grüne Flagge löschen", + "debugger/@settings-name-log_clone_create": "Klon-Erzeugungen loggen", + "debugger/@settings-name-log_failed_clone_creation": "Überschreitung des Klonlimits loggen", + "debugger/@settings-name-log_greenflag": "Klicks auf dei grüne Flagge loggen", + "debugger/@update": "Neue \"Threads\"- und \"Leistung\"-Tabs im Debugger-Fenster.", + "pause/@description": "Fügt eine Pausetaste neben der grünen Flagge hinzu.", + "pause/@name": "Pausetaste", + "mute-project/@description": "Strg+Klicke auf die grüne Flagge, um das Projekt stummzuschalten bzw. die Stummschaltung aufzuheben.", + "mute-project/@info-macOS": "Verwende auf macOS statt der Strg-Taste die Cmd-Taste.", + "mute-project/@name": "Projektplayer stummschalten-Knopf", + "vol-slider/@description": "Fügt einen Lautstärkeregler neben der grünen Flagge hinzu.", + "vol-slider/@name": "Lautstärkeregler", + "vol-slider/@settings-name-defVol": "Standard-Lautstärke", + "clones/@description": "Fügt einen Zähler zum Editor hinzu, der die Anzahl aller Klone anzeigt.", + "clones/@name": "Klonzähler", + "clones/@settings-name-showicononly": "Nur Symbol anzeigen", + "mouse-pos/@description": "Zeigt die x/y-Position des Mauszeigers über der Bühne im Editor an.", + "mouse-pos/@name": "Mauszeigerposition", + "color-picker/@description": "Fügt Hexadezimalcode-Eingaben zum Farbwähler hinzu.", + "color-picker/@name": "Hexadezimal-Farbwähler", + "remove-sprite-confirm/@description": "Fragt, ob du sicher bist, wenn du eine Figur in einem Projekt löschst.", + "remove-sprite-confirm/@name": "Löschen von Figuren bestätigen", + "block-count/@description": "Zeigt die volle Anzahl von Blöcken in der Menüleiste des Projekteditors an. Früher Teil von \"Figuren- und Skriptanzahl\".", + "block-count/@name": "Blockanzahl", + "onion-skinning/@description": "Zeigt ein transparentes Bild des vorherigen oder nächsten Kostüms während dem Bearbeiten eines Kostüms. Du kannst es mit Knöpfen neben den Zoom-Knöpfen im Kostümeditor steuern.", + "onion-skinning/@name": "Onion Skinning", + "onion-skinning/@settings-name-afterTint": "Färbung für nächstes Kostüm", + "onion-skinning/@settings-name-beforeTint": "Färbung für vorheriges Kostüm", + "onion-skinning/@settings-name-default": "Standardmäßig einschalten", + "onion-skinning/@settings-name-layering": "Standardschichtung", + "onion-skinning/@settings-name-mode": "Standardmodus", + "onion-skinning/@settings-name-next": "Standard nächste Kostüme", + "onion-skinning/@settings-name-opacity": "Transparenz (%)", + "onion-skinning/@settings-name-opacityStep": "Transparenz-Abstufung (%)", + "onion-skinning/@settings-name-previous": "Standard vorherige Kostüme", + "onion-skinning/@settings-select-layering-behind": "Hinten", + "onion-skinning/@settings-select-layering-front": "Vorne", + "onion-skinning/@settings-select-mode-merge": "Bilder verbinden", + "onion-skinning/@settings-select-mode-tint": "Farbüberlagerung", + "paint-snap/@description": "Rastet Objekte im Kostümeditor an Kasten und Vektorpunkten ein.", + "paint-snap/@name": "Einrasten im Kostümeditor", + "paint-snap/@settings-name-boxCenter": "Von Auswahlmitte einrasten", + "paint-snap/@settings-name-boxCorners": "Von Auswahlecken einrasten", + "paint-snap/@settings-name-boxEdgeMids": "Von Mittelpunkten von Auswahlrand einrasten", + "paint-snap/@settings-name-enable-default": "Standardmäßig aktivieren", + "paint-snap/@settings-name-guide-color": "Farbe der Einrasthilfe", + "paint-snap/@settings-name-objectCenters": "An Objektmitte einrasten", + "paint-snap/@settings-name-objectCorners": "An Objektecken einrasten", + "paint-snap/@settings-name-objectEdges": "An Objektrand einrasten", + "paint-snap/@settings-name-objectMidlines": "An Objektmittellinien einrasten", + "paint-snap/@settings-name-pageAxes": "An X- und Y- Achsen der Seite einrasten", + "paint-snap/@settings-name-pageCenter": "An Seitenmitte einrasten", + "paint-snap/@settings-name-pageCorners": "An Seitenecken einrasten", + "paint-snap/@settings-name-pageEdges": "An Seitenrand einrasten", + "paint-snap/@settings-name-threshold": "Einrasteabstand", + "default-costume-editor-color/@description": "Ändert die standardmäßige Farbe und Randbreite im Kostümeditor.", + "default-costume-editor-color/@name": "Benutzerdefinierte Standardfarbe im Kostümeditor", + "default-costume-editor-color/@settings-name-fill": "Standardmäßige Füllfarbe", + "default-costume-editor-color/@settings-name-persistence": "Beim Wechseln zwischen Werkzeugen vorherige Farbe beibehalten, anstatt sie zurückzusetzen", + "default-costume-editor-color/@settings-name-stroke": "Standardmäßige Randfarbe", + "default-costume-editor-color/@settings-name-strokeSize": "Standardmäßige Randbreite", + "bitmap-copy/@description": "Ermöglicht es dir, Raster-Bilder aus dem Maleditor in die Zwischenablage des Systems zu kopieren, sodass sie auf anderen Seiten oder Programmen eingefügt werden können.", + "bitmap-copy/@info-norightclick": "\"Rechtsklick → kopieren\" ist nicht unterstützt. Du musst Strg+C drücken, während ein Bitmap Bild ausgewählt ist.", + "bitmap-copy/@name": "Kopieren von Raster-Bildern", + "2d-color-picker/@description": "Ersetzt die Schattierungs- und Helligkeitsschieberegler im Kostümeditor durch einen 2D-Farbenwähler. Halte die Umschalttaste während dem Ziehen des Mauszeigers gedrückt, um die Werte auf einer einzigen Achse zu ändern.", + "2d-color-picker/@name": "2D-Farbenwähler", + "better-img-uploads/@description": "Fügt einen neuen Knopf über dem \"Kostüm hochladen\"-Knopf, der hochgeladene Raster-Bilder automatisch in SVG (Vektor) umwandelt, um die Qualität nicht zu verlieren.", + "better-img-uploads/@info-notSuitableEdit": "Verwende den HD Hochladen-Knopf lieber nicht, wenn du planst, das Bild nach dem Hochladen zu bearbeiten.", + "better-img-uploads/@name": "Bilder mit hoher Auflösung hochladen", + "better-img-uploads/@settings-name-fitting": "Bildgröße", + "better-img-uploads/@settings-select-fitting-fill": "Durch Vergrößern an Bühne anpassen", + "better-img-uploads/@settings-select-fitting-fit": "Durch Verkleinern an Bühne anpassen", + "better-img-uploads/@settings-select-fitting-full": "Originalgröße", + "pick-colors-from-stage/@description": "Ermöglicht es dem Pipettenwerkzeug des Kostümeditors, auch Farben von der Bühne zu wählen.", + "pick-colors-from-stage/@name": "Farben von der Bühne im Kostümeditor auswählen", + "custom-block-shape/@description": "Ändere die Blockhöhe, den Eckenradius und die Höhe der Laschen von Scratch-Blöcken.", + "custom-block-shape/@info-paddingWarning": "Die Änderung der Blockhöhe ist nur für dich sichtbar, deshalb könnten sich deine Skripte, wenn andere Nutzer deine Projekte ansehen, überlappen.", + "custom-block-shape/@name": "Anpassbare Blockform", + "custom-block-shape/@preset-description-default2": "Scratch 2.0-ähnliche Blöcke", + "custom-block-shape/@preset-description-default3": "Die normale Ansicht von Scratch 3.0-Blöcken", + "custom-block-shape/@preset-description-flat2": "Scratch 2.0-Blöcke ohne Laschen und Ecken", + "custom-block-shape/@preset-description-flat3": "Scratch 3.0-Blöcke ohne Laschen und Ecken", + "custom-block-shape/@preset-name-default2": "2.0-Blöcke", + "custom-block-shape/@preset-name-default3": "3.0-Blöcke", + "custom-block-shape/@preset-name-flat2": "Flache 2.0", + "custom-block-shape/@preset-name-flat3": "Flache 3.0", + "custom-block-shape/@settings-name-cornerSize": "Eckengröße (0-300%)", + "custom-block-shape/@settings-name-notchSize": "Laschenhöhe (0-150%)", + "custom-block-shape/@settings-name-paddingSize": "Blockhöhe (50-200%)", + "zebra-striping/@description": "Macht, dass Blöcke der selben Kategorie zwischen helleren und dünkleren Schattierungen abwechseln, wenn sie ineinander verschachtelt sind. Auch als Zebrastreifen bekannt.", + "zebra-striping/@name": "Abwechselnde Farben für verschachtelte Blöcke", + "zebra-striping/@settings-name-intensity": "Stärke (0-100%)", + "zebra-striping/@settings-name-shade": "Schattierung", + "zebra-striping/@settings-select-shade-darker": "Dünkler", + "zebra-striping/@settings-select-shade-lighter": "Heller", + "editor-theme3/@description": "Bearbeite die Farben der Blöcke für jede Kategorie im Editor.", + "editor-theme3/@name": "Anpassbare Blockfarben", + "editor-theme3/@preset-description-black": "Macht Blockhintergründe schwarz", + "editor-theme3/@preset-description-dark": "Dunkle Versionen der Standardfarben", + "editor-theme3/@preset-description-original": "Die originalen Blockfarben von Scratch 2.0", + "editor-theme3/@preset-description-tweaks": "Ereignisse, Steuerung, und Benutzerdefinierte Blöcke mit 2.0-inspirierten Farben", + "editor-theme3/@preset-name-black": "Schwarz", + "editor-theme3/@preset-name-dark": "Dunkel", + "editor-theme3/@preset-name-original": "2.0-Farben", + "editor-theme3/@preset-name-tweaks": "3.0-Optimierungen", + "editor-theme3/@settings-name-Pen-color": "Erweiterungen", + "editor-theme3/@settings-name-comment-color": "Kommentare", + "editor-theme3/@settings-name-control-color": "Steuerung", + "editor-theme3/@settings-name-custom-color": "Benutzerdefiniert", + "editor-theme3/@settings-name-data-color": "Variablen", + "editor-theme3/@settings-name-data-lists-color": "Listen", + "editor-theme3/@settings-name-events-color": "Ereignisse", + "editor-theme3/@settings-name-input-color": "Eingabefelder in Blöcken", + "editor-theme3/@settings-name-looks-color": "Aussehen", + "editor-theme3/@settings-name-motion-color": "Bewegung", + "editor-theme3/@settings-name-operators-color": "Operatoren", + "editor-theme3/@settings-name-sensing-color": "Fühlen", + "editor-theme3/@settings-name-sounds-color": "Klänge", + "editor-theme3/@settings-name-text": "Textfarbe", + "editor-theme3/@settings-select-text-black": "Schwarz", + "editor-theme3/@settings-select-text-colorOnBlack": "Farbig auf schwarzem Hintergrund", + "editor-theme3/@settings-select-text-colorOnWhite": "Farbig auf weißem Hintergrund", + "editor-theme3/@settings-select-text-white": "Weiß", + "editor-theme3/@update": "Die \"Dunkle Kommentare\"-Einstellung von \"Dunkler Modus und anpassbare Farben im Editor\" wurde hierher verschoben und ist jetzt anpassbar.", + "custom-block-text/@description": "Ändert die Dicke von Text auf Blöcken und fügt einen Textschatten hinzu.", + "custom-block-text/@name": "Benutzerdefinierter Stil von Text auf Blöcken", + "custom-block-text/@settings-name-bold": "Fetter Text", + "custom-block-text/@settings-name-shadow": "Schatten unter Text", + "editor-colored-context-menus/@description": "Macht die Kontextmenüs beim Rechtsklicken auf Blöcken farbig.", + "editor-colored-context-menus/@name": "Farbige Kontextmenüs", + "editor-stage-left/@description": "Verschiebt die Bühne auf die linke Seite des Editors, wie in Scratch 2.0.", + "editor-stage-left/@info-reverseOrder": "Um die Position der Schaltflächen über der Bühne zu verändern, verwende das \"Verkehrte Anordnung von Playersteuerelementen\"-Addon.", + "editor-stage-left/@name": "Bühne links anzeigen", + "editor-buttons-reverse-order/@description": "Verschiebt die grüne Flagge und den Stopp-Knopf auf die rechte und den Vollbild-Knopf auf die linke Seite, wie in Scratch 2.0.", + "editor-buttons-reverse-order/@name": "Verkehrte Anordnung von Playersteuerelementen", + "variable-manager/@description": "Fügt einen Tab neben \"Klänge\" im Editor hinzu, um Variablen und Listen einfach zu aktualisieren.", + "variable-manager/@name": "Variablenmanager", + "variable-manager/@update": "Listenelemente können jetzt ohne Gedrückthalten der Umschlttaste eingefügt werden.", + "search-sprites/@description": "Fügt ein Suchfeld zur Figurenleiste hinzu.", + "search-sprites/@name": "Figuren nach Namen suchen", + "sprite-properties/@description": "Versteckt die Eigenschaftenleiste von Figuren, wie in Scratch 2.0. Benutze die Info-Schaltfläche auf der aktuell ausgewählten FIgur oder doppelklicke auf eine Figur, um die Leiste anzuzeigen oder zu verstecken.", + "sprite-properties/@name": "Figureneigenschaften ausblenden", + "sprite-properties/@settings-name-autoCollapse": "Automatisch ausblenden, wenn die Maus den Bereich verlässt", + "sprite-properties/@settings-name-hideByDefault": "Leiste standardmäßig ausblenden", + "sprite-properties/@settings-name-transitionDuration": "Animationsgeschwindigkeit", + "sprite-properties/@settings-select-transitionDuration-default": "Standard", + "sprite-properties/@settings-select-transitionDuration-long": "Langsam", + "sprite-properties/@settings-select-transitionDuration-none": "Sofort", + "sprite-properties/@settings-select-transitionDuration-short": "Schnell", + "gamepad/@description": "Interagiere mit einem USB- oder Bluetoothcontroller/Gamepad mit Projekten.", + "gamepad/@name": "Gamepad-Unterstützung", + "gamepad/@settings-name-hide": "Einstellungenknopf ausblenden, wenn keine Controller erkannt wurden", + "editor-sounds/@description": "Soundeffekte beim Verbinden und Löschen von Blöcken.", + "editor-sounds/@name": "Soundeffekte im Editor", + "folders/@description": "Fügt Ordner zur Figurenliste hinzu, sowie zur Kostüm- und Klangliste. Um einen Ordner zu erstellen, klicke mit der rechten Maustaste auf eine Figur und wähle \"neuer Ordner\". Klicke mit der rechten Maustaste eine Figur an, um sie in einen Ordner zu verschieben, oder ziehe sie in einen offenen Ordner. Dieses Feature funktioniert durch Hinzufügen von \"[Orndername]//\" vor dem Namen deiner Figuren.", + "folders/@info-notice-folders-are-public": "Nutzer, die dieses Feature aktiviert haben, werden die Ordner in deinem Projekt sehen. Alle anderen werden die normale Figurenliste sehen (ohne Ordner).", + "folders/@name": "Figurenordner", + "block-switching/@description": "Klicke mit der rechten Maustaste auf einen Block, um ihn mit einem ähnlichen Block zu ersetzen.", + "block-switching/@name": "Block-Austausch", + "block-switching/@settings-name-control": "Steuerung-Blöcke", + "block-switching/@settings-name-customargs": "Argumente von benutzerdefinierten Blöcken", + "block-switching/@settings-name-customargsmode": "Optionen für angezeigte Blockargumente", + "block-switching/@settings-name-data": "Variablen-Blöcke", + "block-switching/@settings-name-event": "Ereignisse-Blöcke", + "block-switching/@settings-name-extension": "Erweiterungen-Blöcke", + "block-switching/@settings-name-looks": "Aussehen-Blöcke", + "block-switching/@settings-name-motion": "Bewegung-Blöcke", + "block-switching/@settings-name-noop": "Zeige Option zum Ändern des Blocks auf sich selbst", + "block-switching/@settings-name-operator": "Operatoren-Blöcke", + "block-switching/@settings-name-sensing": "Fühlen-Blöcke", + "block-switching/@settings-name-sound": "Klang-Blöcke", + "block-switching/@settings-select-customargsmode-all": "Argumente in allen benutzerdefinierten Blöcken in der Figur", + "block-switching/@settings-select-customargsmode-defOnly": "Argumente in eigenem benutzerdefiniertem Block", + "load-extensions/@description": "Fügt Musik, Malstift, und weitere Erweiterungen automatisch zur Blockkategorienliste hinzu.", + "load-extensions/@name": "Erweiterungen automatisch hinzufügen", + "load-extensions/@settings-name-music": "Musik", + "load-extensions/@settings-name-pen": "Malstift", + "load-extensions/@settings-name-text2speech": "Text zu Sprache", + "load-extensions/@settings-name-translate": "Übersetzen", + "custom-zoom/@description": "Personalisiere den Minimum-, Maximum-, und Startzoom und die Zoom-Geschwindigkeit für den Skriptbereich im Editor, und blende die Steuerelemente automatisch aus.", + "custom-zoom/@name": "Benutzerdefinierter Codebereichzoom", + "custom-zoom/@settings-name-autohide": "Zoom-Steuerelemente automatisch ausblenden", + "custom-zoom/@settings-name-maxZoom": "Maximale Größe (100-500%)", + "custom-zoom/@settings-name-minZoom": "Zoom-Minimum (1-100%)", + "custom-zoom/@settings-name-speed": "Animationsdauer für Ausblenden", + "custom-zoom/@settings-name-startZoom": "Startzoom (50-500%)", + "custom-zoom/@settings-name-zoomSpeed": "Zoom-Geschwindigkeit (50-200%)", + "custom-zoom/@settings-select-speed-default": "Standard", + "custom-zoom/@settings-select-speed-long": "Langsam", + "custom-zoom/@settings-select-speed-none": "Sofort", + "custom-zoom/@settings-select-speed-short": "Schnell", + "initialise-sprite-position/@description": "Ändere die Standard X/Y-Position von neuen Figuren.", + "initialise-sprite-position/@name": "Personalisierbare Standardposition von neuen Figuren", + "initialise-sprite-position/@settings-name-duplicate": "Verhalten beim Duplizieren von Figuren", + "initialise-sprite-position/@settings-name-library": "Position der Figuren aus der Bibliothek zufällig festlegen", + "initialise-sprite-position/@settings-name-x": "X-Position", + "initialise-sprite-position/@settings-name-y": "Y-Position", + "initialise-sprite-position/@settings-select-duplicate-custom": "An spezifische x/y-Werte schicken", + "initialise-sprite-position/@settings-select-duplicate-keep": "Dieselbe Position wie die Originalfigur", + "initialise-sprite-position/@settings-select-duplicate-randomize": "Zufällig", + "blocks2image/@description": "Klicke mit der rechten Maustaste auf den Codebereich, um Blöcke als SVG/PNG-Bilder zu exportieren", + "blocks2image/@name": "Blöcke als Bild speichern", + "remove-curved-stage-border/@description": "Entfernt den runden Rand um die Bühne, um die Ecken sichtbar zu machen.", + "remove-curved-stage-border/@name": "Runden Bühnenrand entfernen", + "transparent-orphans/@description": "Stelle die Transparenz für Blöcke im Editor ein, mit separaten Optionen für alleinstehende Blöcke (solche ohne Startblock) und Blöcke, die gerade gezogen werden.", + "transparent-orphans/@name": "Durchsichtige Blöcke", + "transparent-orphans/@settings-name-block": "Block Transparenz (%)", + "transparent-orphans/@settings-name-dragged": "Gezogene Transparenz (%)", + "transparent-orphans/@settings-name-orphan": "Alleinstehende Transparenz (%)", + "paint-by-default/@description": "Ändert die Standardaktion von \"Figur/Kostüm/Hintergrund/Klang\" wählen\"-Knöpfen, die die Bibliothek standardmäßig öffnen.", + "paint-by-default/@name": "Benutzerdefiniertes Verhalten von Hinzufügen-Buttons", + "paint-by-default/@settings-name-backdrop": "Hintergrund hinzufügen", + "paint-by-default/@settings-name-costume": "Kostüm hinzufügen", + "paint-by-default/@settings-name-sound": "Klang hinzufügen", + "paint-by-default/@settings-name-sprite": "Figur hinzufügen", + "paint-by-default/@settings-select-backdrop-library": "Bibliothek", + "paint-by-default/@settings-select-backdrop-paint": "Malen", + "paint-by-default/@settings-select-backdrop-surprise": "Überraschung", + "paint-by-default/@settings-select-backdrop-upload": "Hochladen", + "paint-by-default/@settings-select-costume-library": "Bibliothek", + "paint-by-default/@settings-select-costume-paint": "Malen", + "paint-by-default/@settings-select-costume-surprise": "Überraschen", + "paint-by-default/@settings-select-costume-upload": "Hochladen", + "paint-by-default/@settings-select-sound-library": "Bibliothek", + "paint-by-default/@settings-select-sound-record": "Aufnehmen", + "paint-by-default/@settings-select-sound-surprise": "Überraschung", + "paint-by-default/@settings-select-sound-upload": "Hochladen", + "paint-by-default/@settings-select-sprite-library": "Bibliothek", + "paint-by-default/@settings-select-sprite-paint": "Malen", + "paint-by-default/@settings-select-sprite-surprise": "Überraschung", + "paint-by-default/@settings-select-sprite-upload": "Hochladen", + "block-cherry-picking/@description": "Halte die Strg-Taste gedrückt, um einzelne Blöcke (anstatt des ganzen Stapels darunter) aus der Mitte eines Skripts zu nehmen.", + "block-cherry-picking/@info-flipControls": "\"Steuerung invertieren\" legt das individuelle Nehmen von Blöcken als Standardmäßiges Verhalten fest. Halte Strg gedrückt, um den ganzen Stapel zu ziehen.", + "block-cherry-picking/@info-macContextDisabled": "Auf macOS, verwende anstatt der Strg-Taste die Cmd-Taste.", + "block-cherry-picking/@name": "Einzelne Blöcke mit Strg-Taste nehmen", + "block-cherry-picking/@settings-name-invertDrag": "Steuerung invertieren", + "hide-new-variables/@description": "Keine Anzeigen für neu erstellte Variablen oder Listen automatisch erstellen.", + "hide-new-variables/@name": "Neue Variablen verstecken", + "editor-extra-keys/@description": "Fügt mehr Tasten zum \"Taste () gedrückt?\" und \"Wenn Taste () gedrückt\" Block-Dropdown hinzu, wie Enter, Punkt, Komma und mehr. Diese Tasten werden auch für Nutzer ohne das Addon funktionieren.", + "editor-extra-keys/@info-experimentalKeysWarn": "\"Experimentelle Tasten\" sind Tasten wie Gleich-Zeichen, Schrägstrich, Strichpunkt und mehr. Sie könnten auf manchen Betriebssystemen und Tastaturlayouts nicht funktionieren.", + "editor-extra-keys/@info-shiftKeysWarn": "\"Umschalttasten\" sind Tasten, die normalerweise das Drücken der Umschalt-Taste und eine Zahl benötigen, wie Rufezeichen, Dollar-Symbol und mehr. Diese Tasten funktionieren nur mit dem \"wenn Taste () gedrückt\"-Block und könnten auf manchen Betriebssystemen und Tastaturlayouts nicht funktionieren. ", + "editor-extra-keys/@name": "Zusätzliche Tastenoptionen", + "editor-extra-keys/@settings-name-experimentalKeys": "Experimentelle Tasten anzeigen", + "editor-extra-keys/@settings-name-shiftKeys": "Umschalttasten anzeigen", + "hide-delete-button/@description": "Versteckt den Löschen-Knopf (das Mülleimer-Icon) von FIguren, Kostümen und Klängen. Sie können weiterhin mit dem Rechtsklick-Kontextmenü glöscht werden.", + "hide-delete-button/@name": "Löschen-Knopf verstecken", + "hide-delete-button/@settings-name-costumes": "Kostüme und Hintergründe", + "hide-delete-button/@settings-name-sounds": "Klänge", + "hide-delete-button/@settings-name-sprites": "Figuren", + "no-script-bumping/@description": "Erlaubt es Skripten, herumbewegt und bearbeitet zu werden, ohne dabei das Fortbewegen von überlappenden Skripten zu verursachen.", + "no-script-bumping/@name": "Überlappende Skripte nicht automatisch verschieben", + "disable-stage-drag-select/@description": "Entfernt die Möglichkeit, Figuren auf der Bühne herumzuziehen, explizit ziehbare Figuren ausgenommen. Halte Shift gedrückt, um Figuren normal zu verschieben.", + "disable-stage-drag-select/@name": "Nicht ziehbare Figuren im Editor", + "move-to-top-bottom/@description": "Fügt Optionen zum Verschieben von Kostümen und Klängen an erste oder letzte Stelle der Liste zum Rechtsklick-Kontextmenü hinzu.", + "move-to-top-bottom/@info-developer-tools": "Dieses Addon gehörte früher zum \"Entwicklertools\"-Addon, aber es wurde hierher verschoben.", + "move-to-top-bottom/@name": "Element an erste/letzte Stelle verschieben", + "disable-paste-offset/@description": "Fügt kopierte Elemente an ihrer ursprünglichen Position im Kostümeditor ein, antstatt die leicht zu verschieben.", + "disable-paste-offset/@info-vanilla": "Dieses Verhalten kann auch ohne das Addon durch Alt+Klick auf das Objekt erhalten werden.", + "disable-paste-offset/@name": "Eingefügte Elemente nicht verschieben", + "block-duplicate/@description": "Dupliziere schnell ein SKript, indem du es mit gedrückter Alt-Taste ziehst. Halte gleichzeitig auch Strg gedrückt, um nur den einzelnen Block zu duplizieren.", + "block-duplicate/@info-mac": "Verwende auf macOS die Option-Taste statt der Alt-Taste und die Command-Taste statt der Strg-Taste.", + "block-duplicate/@name": "Skripte mit Alt-Taste duplizieren", + "rename-broadcasts/@description": "Fügt eine Option im Dropdownmenü von Nachrichtenblöcken hinzu, mit der du Nachrichten umbenennen kannst.", + "rename-broadcasts/@name": "Nachrichten umbenennen", + "swap-local-global/@description": "Fügt weitere Optionen beim Umbenennen einer vorhandenen Variablen oder Liste hinzu: ermöglicht das Wechseln zwischen \"Für alle Figuren\" und \"Nur für diese Figur\" und ob Variablen in der Cloud gespeichert werden. Fügt auch eine neue Option beim Rechtsklicken auf eine Variable/Liste hinzu, um deren Typ schnell zu ändern.", + "swap-local-global/@name": "Variablentyp ändern", + "editor-comment-previews/@description": "Ermöglicht das Anzeigen einer Vorschau, wenn die Maus über reduzierten Kommentaren und Blöcken. Du kannst dies verwenden, um Kommentare außerhalb des Bildschirms anzuzeigen, einen Schleifenblock von seiner Unterseite anhand der Vorschau zu identifizieren, mehrere lange Kommentare in einen kleinen Bereich anzupassen und mehr.", + "editor-comment-previews/@name": "Vorschau für Editorkommentare", + "editor-comment-previews/@settings-name-delay": "Verzögerungsdauer", + "editor-comment-previews/@settings-name-follow-mouse": "Maus folgen", + "editor-comment-previews/@settings-name-hover-view": "Zum Vorschauen mit der Maus über reduzierten Kommentaren schweben", + "editor-comment-previews/@settings-name-hover-view-block": "Zum Vorschauen von angehängten Kommentaren mit der Maus über Blöcken schweben", + "editor-comment-previews/@settings-name-hover-view-procedure": "Zum Vorschauen von Definitionskommentaren mit der Maus über benutzerdefinierten Blöcken schweben", + "editor-comment-previews/@settings-name-reduce-animation": "Animation reduzieren", + "editor-comment-previews/@settings-name-reduce-transparency": "Durchsichtigkeit vermindern", + "editor-comment-previews/@settings-select-delay-long": "Lang", + "editor-comment-previews/@settings-select-delay-none": "Keine", + "editor-comment-previews/@settings-select-delay-short": "Kurz", + "columns/@description": "Trennt das Blockkategorienmenü in zwei Spalten und verschiebt es über die Blockpalette, wie in Scratch 2.0.", + "columns/@name": "Zweispaltiges Kategorienmenü", + "number-pad/@description": "Zeigt Scratchs Zahleneingabepad, das bei der Eingabe in Zahlenfeldern auf Touchscreen-Geräten geöffnet wird, auf allen Geräten an.", + "number-pad/@info-explanation": "Die Zifferntastatur wird beim Bearbeiten von Zahlenfeldern auf bestimmten Blöcken wie \"setze x auf\" angezeigt.", + "number-pad/@name": "Zifferntastatur immer anzeigen", + "script-snap/@description": "Richtet Skripte nach dem Ziehen automatisch an den Punkten des Codebereichs aus.", + "script-snap/@name": "Skripte am Raster ausrichten", + "script-snap/@preset-name-default": "Standard", + "script-snap/@preset-name-half-block": "Halbblöckig", + "script-snap/@preset-name-whole-block": "Ganzblöckig", + "script-snap/@settings-name-grid": "Rastergröße (px)", + "fullscreen/@description": "Behebt einige unerwünschte Effekte im Vollbildmodus des Projektplayers, öffnet ihn im Vollbildmodus deines Browsers und blendet die Symbolleiste mit der grünen Flagge aus.", + "fullscreen/@info-hideToolbarNotice": "Wenn du die Symbolleiste ausblendest, denke daran, dass du mit der Esc-Taste den Vollbildmodus des Projektplayers verlassen kannst.", + "fullscreen/@name": "Verbesserter Vollbildmodus", + "fullscreen/@settings-name-browserFullscreen": "Projektplayer im Vollbildmodus des Browsers öffnen", + "fullscreen/@settings-name-hideToolbar": "Titelleiste im Vollbild ausblenden", + "hide-stage/@description": "Fügt einen Knopf neben dem \"Kleine Bühne\"-Knopf hinzu, mit dem du die Bühne und die Figurenleiste vollständig ausblenden und damit den Codebereich viel größer machen kannst.", + "hide-stage/@name": "Bühne und Figurenleiste ausblenden", + "editor-stepping/@description": "Fügt eine farbige Markierung zu den Blöcken, die gerade in einem Projekt ausgeführt werden, hinzu.", + "editor-stepping/@name": "Markierung für ausgeführte Blöcke", + "editor-stepping/@settings-name-highlight-color": "Markierungsfarbe" +} \ No newline at end of file diff --git a/src/addons/addons-l10n-settings/es.json b/src/addons/addons-l10n-settings/es.json new file mode 100644 index 0000000000000000000000000000000000000000..2340bea8d9b26fea9e500731a5b343f339bb5915 --- /dev/null +++ b/src/addons/addons-l10n-settings/es.json @@ -0,0 +1,343 @@ +{ + "cat-blocks/@description": "Regresa los cat blocks de April Fools 2020.", + "cat-blocks/@info-watch": "La opción \"mirar cursor\" puede afectar el rendimiento cuando está abierto el editor.", + "cat-blocks/@settings-name-watch": "Mirar cursor", + "editor-devtools/@description": "Añade nuevas opciones de menú al editor: copiar/pegar bloques, mejor ordenado de bloques, ¡y más!", + "editor-devtools/@name": "Herramientas de desarrollador", + "editor-devtools/@settings-name-enableCleanUpPlus": "Mejorar \"Ordenar Bloques\"", + "editor-devtools/@settings-name-enablePasteBlocksAtMouse": "Pegar bloques en la posición del cursor", + "find-bar/@description": "Agrega una barra de búsqueda al lado de la pestaña de sonidos para encontrar y saltar a scripts, disfraces y sonidos. Use Ctrl+Izquierda y Ctrl+Derecha en el área de código para navegar a la posición visitada anterior o siguiente luego de usar la barra de búsqueda.", + "find-bar/@info-developer-tools": "Este addon era parte de \"herramientas de desarrollador\", pero se ha mudado aquí.", + "find-bar/@name": "Barra de búsqueda en editor", + "middle-click-popup/@info-developer-tools": "Este addon era parte de \"herramientas de desarrollador\", pero se ha mudado aquí.", + "middle-click-popup/@name": "Insertar bloques por nombre", + "jump-to-def/@description": "Le permite saltar a la definición de un bloque personalizado usando el botón del medio del ratón o presionando Shift+Click en el bloque.", + "jump-to-def/@info-developer-tools": "Este addon era parte de \"herramientas de desarrollador\", pero se ha mudado aquí.", + "jump-to-def/@name": "Saltar a definición de bloque personalizado", + "editor-searchable-dropdowns/@description": "Le permite buscar en bloques que tienen menús.", + "editor-searchable-dropdowns/@name": "Búsqueda en menús ", + "data-category-tweaks-v2/@description": "Proporciona retoques para la categoría de bloques \"datos\" (variables).", + "data-category-tweaks-v2/@name": "Retoques en categoría \"datos\"", + "data-category-tweaks-v2/@settings-name-moveReportersDown": "Mover bloques de datos arriba de la lista de variables", + "data-category-tweaks-v2/@settings-name-separateListCategory": "Categoría Listas Separada", + "data-category-tweaks-v2/@settings-name-separateLocalVariables": "Separar Variables Locales", + "block-palette-icons/@description": "Agrega íconos dentro de los círculos de colores que identifican las categorías de bloques.", + "block-palette-icons/@name": "Íconos de categoría en paleta de bloques", + "hide-flyout/@description": "Oculta la paleta de bloques si el cursor no esta arriba de ella. Haga click en el icono de candado para mantenerlo en el lugar temporalmente. Alternativamente, use el modo \"click en categoría\".", + "hide-flyout/@info-hoverExplanation": "El modo \"cursor sobre área de paleta\" solo extiende el área de visión. Si quiere poder arrastrar bloques a este área sin que se tiren a la basura, use alguno de los otros modos.", + "hide-flyout/@name": "Ocultar paleta de bloques automáticamente", + "hide-flyout/@settings-name-speed": "Velocidad de animación", + "hide-flyout/@settings-name-toggle": "Activar/desactivar en...", + "hide-flyout/@settings-select-speed-default": "Por defecto", + "hide-flyout/@settings-select-speed-long": "Lenta", + "hide-flyout/@settings-select-speed-none": "Instantánea", + "hide-flyout/@settings-select-speed-short": "Rápida", + "hide-flyout/@settings-select-toggle-category": "Click en categoría", + "hide-flyout/@settings-select-toggle-cathover": "Cursor sobre categoría", + "hide-flyout/@settings-select-toggle-hover": "Cursor sobre área de paleta", + "hide-flyout/@update": "Este addon fue revisado y se arreglaron muchos errores.", + "mediarecorder/@description": "Agrega un botón \"empezar grabación\" al menú del editor que le permite grabar el escenario del proyecto.", + "mediarecorder/@name": "Grabador de video de proyectos", + "drag-drop/@description": "Le permite arrastrar imágenes y sonidos de su administrador de archivos y soltarlos en el panel de objetos o la lista de disfraces/sonidos. También puede arrastrar archivos de texto a listas y cajas de respuesta.", + "drag-drop/@name": "Arrastrar y soltar archivos", + "drag-drop/@settings-name-use-hd-upload": "Usar subidas HD", + "debugger/@name": "Depurador", + "debugger/@settings-name-log_broadcasts": "Loguear mensajes enviados", + "debugger/@settings-name-log_clear_greenflag": "Borrar logs al tocar bandera verde", + "debugger/@settings-name-log_clone_create": "Loguear creación de clones", + "debugger/@settings-name-log_failed_clone_creation": "Loguear máximo de clones excedido", + "debugger/@settings-name-log_greenflag": "Loguear clicks a bandera verde", + "debugger/@update": "Nuevas pestañas \"Hilos\" y \"Rendimiento\" en la ventana del depurador.", + "pause/@description": "Agrega un botón de pausa al lado de la bandera verde.", + "pause/@name": "Botón de pausa", + "mute-project/@description": "Presione Ctrl+Click sobre la bandera verde para silenciar o desilenciar el proyecto.", + "mute-project/@info-macOS": "En macOS, use la tecla Cmd en vez de Ctrl.", + "mute-project/@name": "Modo silenciado de reproductor de proyectos", + "vol-slider/@description": "Agrega un control deslizante de volumen al lado de los controles de la bandera verde.", + "vol-slider/@name": "Deslizador de volumen del proyecto", + "vol-slider/@settings-name-defVol": "Volumen por defecto", + "clones/@description": "Agrega un contador de clones arriba del escenario en el editor que muestra la cantidad total de clones del proyecto.", + "clones/@name": "Contador de clones", + "clones/@settings-name-showicononly": "Mostrar ícono solamente", + "mouse-pos/@description": "Muestra la posición x/y del ratón arriba del escenario en el editor.", + "mouse-pos/@name": "Posición del ratón", + "color-picker/@description": "Agrega una entrada de colores hex a los selectores de color.", + "color-picker/@name": "Selector de color hex", + "remove-sprite-confirm/@description": "Le pregunta si está seguro cuando borre un objecto en un proyecto", + "remove-sprite-confirm/@name": "Confirmación de eliminación de objeto", + "block-count/@description": "Muestra el número total de bloques de un proyecto en la barra de menú del editor. Previamente parte de \"contador de objetos y scripts\".", + "block-count/@name": "Contador de bloques", + "onion-skinning/@description": "Muestra capas transparentes de los disfraces anteriores o siguientes mientras edita un disfraz. Controlado con los botones debajo del editor de disfraces, al lado de los botones de zoom.", + "onion-skinning/@name": "Capa sobre capa (onion skinning)", + "onion-skinning/@settings-name-afterTint": "Teñir color de disfraz siguiente", + "onion-skinning/@settings-name-beforeTint": "Teñir color de disfraz anterior", + "onion-skinning/@settings-name-default": "Activar por defecto", + "onion-skinning/@settings-name-layering": "Método de superposición por defecto", + "onion-skinning/@settings-name-mode": "Modo por defecto", + "onion-skinning/@settings-name-next": "Valor predeterminado de disfraces siguientes", + "onion-skinning/@settings-name-opacity": "Opacidad (%)", + "onion-skinning/@settings-name-opacityStep": "Salto de Opacidad (%)", + "onion-skinning/@settings-name-previous": "Valor predeterminado de disfraces anteriores", + "onion-skinning/@settings-select-layering-behind": "Detrás", + "onion-skinning/@settings-select-layering-front": "Frente", + "onion-skinning/@settings-select-mode-merge": "Combinar imagenes", + "onion-skinning/@settings-select-mode-tint": "Teñir color", + "paint-snap/@description": "Ajusta objetos en el editor de disfraces a cuadros de delimitación y nodos de vectores.", + "paint-snap/@name": "Ajustar posición del editor de disfraces ", + "paint-snap/@settings-name-boxCenter": "Ajustar desde centro de caja de selección", + "paint-snap/@settings-name-boxCorners": "Ajustar desde esquinas de caja de selección", + "paint-snap/@settings-name-boxEdgeMids": "Ajustar desde puntos medios de lados de caja de selección", + "paint-snap/@settings-name-enable-default": "Habilitar por defecto", + "paint-snap/@settings-name-guide-color": "Color de la guía del ajuste", + "paint-snap/@settings-name-objectCenters": "Ajustar a centros de objetos", + "paint-snap/@settings-name-objectCorners": "Ajustar a esquinas de objetos", + "paint-snap/@settings-name-objectEdges": "Ajustar a lados de objetos", + "paint-snap/@settings-name-objectMidlines": "Ajustar a líneas centrales de objetos", + "paint-snap/@settings-name-pageAxes": "Ajustar a ejes x e y de la página", + "paint-snap/@settings-name-pageCenter": "Ajustar a centro de página", + "paint-snap/@settings-name-pageCorners": "Ajustar a esquinas de la página", + "paint-snap/@settings-name-pageEdges": "Ajustar a lados de la página", + "paint-snap/@settings-name-threshold": "Distancia de ajuste", + "default-costume-editor-color/@description": "Cambia los colores predeterminados y el tamaño del borde utilizados por el editor de disfraces.", + "default-costume-editor-color/@name": "Color predeterminado personalizable en el editor de disfraces", + "default-costume-editor-color/@settings-name-fill": "Color de relleno predeterminado", + "default-costume-editor-color/@settings-name-persistence": "Usar color anterior en vez de reiniciar al cambiar de herramienta", + "default-costume-editor-color/@settings-name-stroke": "Color de borde predeterminado", + "default-costume-editor-color/@settings-name-strokeSize": "Tamaño de borde predeterminado", + "bitmap-copy/@description": "Le permite copiar una imagen bitmap en el editor de disfraces al portapapeles de su sistema, para que la puedas pegar en otros sitios web o programas.", + "bitmap-copy/@info-norightclick": "\"Click derecho → copiar\" no está soportado. Debe presionar Ctrl+C cuando la imagen bitmap este seleccionada.", + "bitmap-copy/@name": "Copiar imágenes bitmap", + "2d-color-picker/@description": "Remplaza los deslizadores de saturación y brillo con un selector de color 2D. Presione Shift mientras arrastra el cursor para cambiar los valores en un solo eje.", + "2d-color-picker/@name": "Selector de color 2D", + "better-img-uploads/@description": "Agrega un nuevo botón arriba del botón \"subir disfraz\" que automáticamente convierte imágenes bitmap subidas a imágenes SVG (vector) para evitar perder calidad.", + "better-img-uploads/@info-notSuitableEdit": "Evite usar el botón de subida HD si tiene planeado editar la imagen luego de subirla.", + "better-img-uploads/@name": "Subida de imágenes HD", + "better-img-uploads/@settings-name-fitting": "Tamaño de imagen", + "better-img-uploads/@settings-select-fitting-fill": "Estirar para llenar escenario", + "better-img-uploads/@settings-select-fitting-fit": "Achicar para encajar en escenario", + "better-img-uploads/@settings-select-fitting-full": "Tamaño original", + "pick-colors-from-stage/@description": "Permite que el cuentagotas también pueda elegir colores del escenario.", + "pick-colors-from-stage/@name": "Seleccionar colores del escenario en el editor de disfraces", + "custom-block-shape/@description": "Ajuste el relleno, radio de esquinas y altura de la muesca de los bloques.", + "custom-block-shape/@info-paddingWarning": "Si baja el valor de tamaño del relleno, cuando otros usuarios vean su proyecto, podría parecer que sus scripts se superponen.", + "custom-block-shape/@name": "Forma de bloque personalizada", + "custom-block-shape/@preset-description-default2": "Una apariencia similar a bloques de Scratch 2.0", + "custom-block-shape/@preset-description-default3": "La apariencia regular de bloques de Scratch 3.0", + "custom-block-shape/@preset-description-flat2": "Bloques de Scratch 2.0 sin muesca ni esquinas", + "custom-block-shape/@preset-description-flat3": "Bloques de Scratch 3.0 sin muesca ni esquinas", + "custom-block-shape/@preset-name-default2": "Bloques 2.0", + "custom-block-shape/@preset-name-default3": "Bloques 3.0", + "custom-block-shape/@preset-name-flat2": "2.0 Plano", + "custom-block-shape/@preset-name-flat3": "3.0 Plano", + "custom-block-shape/@settings-name-cornerSize": "Tamaño de esquinas (0-300%)", + "custom-block-shape/@settings-name-notchSize": "Altura de muesca (0-150%)", + "custom-block-shape/@settings-name-paddingSize": "Tamaño de relleno/padding (50-200%)", + "zebra-striping/@description": "Alterna entre tonos más claros y más oscuros a los bloques de la misma categoría anidados entre sí. Esto también es conocido como \"zebra striping\".", + "zebra-striping/@name": "Alternar colores de bloques anidados", + "zebra-striping/@settings-name-intensity": "Intensidad (0-100%)", + "zebra-striping/@settings-name-shade": "Tonalidad", + "zebra-striping/@settings-select-shade-darker": "Oscura", + "zebra-striping/@settings-select-shade-lighter": "Clara", + "editor-theme3/@description": "Edite los colores para cada categoría de bloques del editor.", + "editor-theme3/@name": "Colores de bloques personalizables", + "editor-theme3/@preset-description-black": "Hace negros los fondos de los bloques", + "editor-theme3/@preset-description-dark": "Versiones oscuras de colores predeterminados", + "editor-theme3/@preset-description-original": "Los colores originales de Scratch 2.0", + "editor-theme3/@preset-description-tweaks": "Usa colores inspirados en 2.0 en las categorías Eventos, Control y Mis bloques. ", + "editor-theme3/@preset-name-black": "Negro", + "editor-theme3/@preset-name-dark": "Oscuro", + "editor-theme3/@preset-name-original": "Colores de la 2.0", + "editor-theme3/@preset-name-tweaks": "3.0 Mejorado", + "editor-theme3/@settings-name-Pen-color": "extensiones", + "editor-theme3/@settings-name-comment-color": "Comentarios", + "editor-theme3/@settings-name-custom-color": "personalizado", + "editor-theme3/@settings-name-data-lists-color": "listas", + "editor-theme3/@settings-name-events-color": "eventos", + "editor-theme3/@settings-name-input-color": "Campos de bloques", + "editor-theme3/@settings-name-looks-color": "apariencia", + "editor-theme3/@settings-name-motion-color": "movimiento", + "editor-theme3/@settings-name-operators-color": "operadores", + "editor-theme3/@settings-name-sensing-color": "sensores", + "editor-theme3/@settings-name-sounds-color": "sonidos", + "editor-theme3/@settings-name-text": "Color del texto", + "editor-theme3/@settings-select-text-black": "Negro", + "editor-theme3/@settings-select-text-colorOnBlack": "Con color en fondo negro", + "editor-theme3/@settings-select-text-colorOnWhite": "Con color en fondo blanco", + "editor-theme3/@settings-select-text-white": "Blanco", + "editor-theme3/@update": "El ajuste \"Comentarios oscuros\" de \"Modo oscuro del editor y colores personalizados\" se ha movido aquí y ahora es personalizable.", + "custom-block-text/@description": "Cambia el grosor del texto en bloques y opcionalmente agrega una sombra al texto.", + "custom-block-text/@name": "Estilo de texto de bloques personalizado", + "custom-block-text/@settings-name-bold": "Texto en negrita", + "custom-block-text/@settings-name-shadow": "Sombra bajo texto", + "editor-colored-context-menus/@description": "Hace que los menús al dar click derecho en un bloque sean coloridos.", + "editor-colored-context-menus/@name": "Menús coloridos", + "editor-stage-left/@description": "Mueve el escenario al lado izquierdo del editor, como en Scratch 2.0.", + "editor-stage-left/@info-reverseOrder": "Para cambiar la posición de los botones arriba del escenario, use el addon \"invertir orden de los controles del proyecto\".", + "editor-stage-left/@name": "Mostrar escenario del lado izquierdo", + "editor-buttons-reverse-order/@description": "Mueve la bandera verde y el botón de detener a la derecha, y el botón de pantalla completa a la izquierda, como en Scratch 2.0.", + "editor-buttons-reverse-order/@name": "Invertir orden de los controles del proyecto", + "variable-manager/@description": "Agrega una pestaña al lado de \"sonidos\" en el editor para que pueda fácilmente editar variables y listas.", + "variable-manager/@name": "Gestor de variables", + "variable-manager/@update": "Los elementos de las listas ahora pueden ser insertados sin estar manteniendo la tecla Shift.", + "search-sprites/@description": "Agrega una barra de búsqueda al panel de objetos para buscar objetos por nombre.", + "search-sprites/@name": "Buscar objetos por nombre", + "sprite-properties/@description": "Esconde en panel de propiedades de sprite por defecto, como en Scratch 2.0. Use el botón de información en el sprite actualmente seleccionado o haga doble click en un sprite para mostrar el panel de propiedades otra vez. Para volver a esconderlo, use el botón de colapsar en el panel de propiedades o haga doble click en un sprite.", + "sprite-properties/@name": "Colapsar propiedades de sprites", + "sprite-properties/@settings-name-autoCollapse": "Colapsar automáticamente cuando el cursor se aleja del panel de sprites", + "sprite-properties/@settings-name-hideByDefault": "Colapsar panel por defecto", + "sprite-properties/@settings-name-transitionDuration": "Velocidad de animación", + "sprite-properties/@settings-select-transitionDuration-default": "Predeterminada", + "sprite-properties/@settings-select-transitionDuration-long": "Lenta", + "sprite-properties/@settings-select-transitionDuration-none": "Instantánea", + "sprite-properties/@settings-select-transitionDuration-short": "Rápida", + "gamepad/@description": "Interactúe con proyectos usando un control/mando de videojuegos mediante USB o Bluetooth.", + "gamepad/@name": "Soporte de mando de videojuegos", + "gamepad/@settings-name-hide": "Esconder botón de ajustes cuando no hay mandos conectados", + "editor-sounds/@description": "Reproduce efectos de sonido cuando conecta o elimina bloques.", + "editor-sounds/@name": "Efectos de sonido en editor", + "folders/@description": "Agrega carpetas a listas de objetos, como también a las listas de disfraces y sonidos. Para crear una carpeta, haga click derecho en un objeto y seleccione \"crear carpeta\". Haga click en una carpeta para abrirla o cerrarla. Haga click derecho en un objeto para ver a qué carpetas lo puede mover, o alternativamente arrastre y suelte a una carpeta abierta. Esta función agrega \"[nombreDeLaCarpeta]//\" al principio del nombre de sus objetos.", + "folders/@info-notice-folders-are-public": "Usuarios con esta función activada podrán ver las carpetas en su proyecto. Cualquier otra persona verá las listas de objetos normalmente (sin carpetas)", + "folders/@name": "Carpetas de objetos", + "block-switching/@description": "Haga click derecho en un bloque para cambiarlo por otro bloque relacionado.", + "block-switching/@name": "Cambio entre bloques", + "block-switching/@settings-name-control": "Bloques de control", + "block-switching/@settings-name-customargs": "Argumentos de bloques personalizados", + "block-switching/@settings-name-customargsmode": "Opciones mostradas de argumentos de bloques personalizados", + "block-switching/@settings-name-data": "Bloques de variables", + "block-switching/@settings-name-event": "Bloques de eventos", + "block-switching/@settings-name-extension": "Bloques de extensiones", + "block-switching/@settings-name-looks": "Bloques de apariencia", + "block-switching/@settings-name-motion": "Bloques de movimiento", + "block-switching/@settings-name-noop": "Permitir cambiar un bloque a sí mismo", + "block-switching/@settings-name-operator": "Bloques de operadores", + "block-switching/@settings-name-sensing": "Bloques de sensores", + "block-switching/@settings-name-sound": "Bloques de sonido", + "block-switching/@settings-select-customargsmode-all": "Argumentos en todos los bloques personalizados del objeto", + "block-switching/@settings-select-customargsmode-defOnly": "Argumentos en bloque personalizado propio", + "load-extensions/@description": "Muestra automáticamente música, lápiz y otras extensiones del editor en el menú de categorías del editor.", + "load-extensions/@name": "Agregar extensiones automáticamente", + "load-extensions/@settings-name-music": "Música", + "load-extensions/@settings-name-pen": "Lápiz", + "load-extensions/@settings-name-text2speech": "Texto a Voz", + "load-extensions/@settings-name-translate": "Traducir", + "custom-zoom/@description": "Elija ajustes personalizados para el mínimo, máximo, velocidad y tamaño inicial del zoom en el área de código y esconda los controles automáticamente.", + "custom-zoom/@name": "Zoom de área de código personalizado", + "custom-zoom/@settings-name-autohide": "Esconder controles cuando el cursor no está sobre ellos", + "custom-zoom/@settings-name-maxZoom": "Zoom Máximo (100-500%)", + "custom-zoom/@settings-name-minZoom": "Zoom mínimo (1-100%)", + "custom-zoom/@settings-name-speed": "Velocidad de animación al esconder controles", + "custom-zoom/@settings-name-startZoom": "Zoom inicial (50-500%)", + "custom-zoom/@settings-name-zoomSpeed": "Velocidad de zoom (50-200%)", + "custom-zoom/@settings-select-speed-default": "Predeterminada", + "custom-zoom/@settings-select-speed-long": "Lenta", + "custom-zoom/@settings-select-speed-none": "Instantánea", + "custom-zoom/@settings-select-speed-short": "Rápida", + "initialise-sprite-position/@description": "Cambia la posición x/y predeterminada de nuevos objetos.", + "initialise-sprite-position/@name": "Posición predeterminada de nuevos objetos personalizable", + "initialise-sprite-position/@settings-name-duplicate": "Comportamiento al duplicar objetos", + "initialise-sprite-position/@settings-name-library": "Posiciones aleatorias al agregar objetos de la librería", + "initialise-sprite-position/@settings-name-x": "Posición X", + "initialise-sprite-position/@settings-name-y": "Posición Y", + "initialise-sprite-position/@settings-select-duplicate-custom": "Enviar a valores x/y especificados", + "initialise-sprite-position/@settings-select-duplicate-keep": "Mantener como el objeto original", + "initialise-sprite-position/@settings-select-duplicate-randomize": "Aleatorizar", + "blocks2image/@description": "Haga click derecho en el área de código para exportar bloques como imágenes SVG/PNG.", + "blocks2image/@name": "Guardar bloques como imagen", + "remove-curved-stage-border/@description": "Quita los bordes curvos alrededor del escenario, permitiéndole ver las esquinas.", + "remove-curved-stage-border/@name": "Quitar curva del borde del escenario", + "transparent-orphans/@description": "Ajuste la transparencia de los bloques del editor, con opciones separadas para bloques huérfanos (aquellos sin un bloque de evento en su parte superior) y bloques que están siendo arrastrados.", + "transparent-orphans/@name": "Bloques transparentes", + "transparent-orphans/@settings-name-block": "Transparencia de bloques (%)", + "transparent-orphans/@settings-name-dragged": "Transparencia arrastrando (%)", + "transparent-orphans/@settings-name-orphan": "Transparencia de huérfanos (%)", + "paint-by-default/@description": "Cambia la acción por defecto de los botones \"Elegir un objeto/disfraz/fondo/sonido\", que abren la biblioteca por defecto.", + "paint-by-default/@name": "Pintar disfraz por defecto", + "paint-by-default/@settings-name-backdrop": "Agregar fondo", + "paint-by-default/@settings-name-costume": "Agregar disfraz", + "paint-by-default/@settings-name-sound": "Agregar sonido", + "paint-by-default/@settings-name-sprite": "Agregar objeto", + "paint-by-default/@settings-select-backdrop-library": "Biblioteca", + "paint-by-default/@settings-select-backdrop-paint": "Pintar", + "paint-by-default/@settings-select-backdrop-surprise": "Sorpresa", + "paint-by-default/@settings-select-backdrop-upload": "Subir", + "paint-by-default/@settings-select-costume-library": "Biblioteca", + "paint-by-default/@settings-select-costume-paint": "Pintar", + "paint-by-default/@settings-select-costume-surprise": "Sorpresa", + "paint-by-default/@settings-select-costume-upload": "Subir", + "paint-by-default/@settings-select-sound-library": "Biblioteca", + "paint-by-default/@settings-select-sound-record": "Grabar", + "paint-by-default/@settings-select-sound-surprise": "Sorpresa", + "paint-by-default/@settings-select-sound-upload": "Subir", + "paint-by-default/@settings-select-sprite-library": "Biblioteca", + "paint-by-default/@settings-select-sprite-paint": "Pintar", + "paint-by-default/@settings-select-sprite-surprise": "Sorpresa", + "paint-by-default/@settings-select-sprite-upload": "Subir", + "block-cherry-picking/@description": "Le permite arrastrar un único bloque del medio de un script (en vez de toda la pila adjunta debajo) mientras mantenga la tecla Ctrl.", + "block-cherry-picking/@info-flipControls": "Si \"revertir controles\" está activado, agarrar bloques individualmente será el comportamiento predeterminado. Mantenga Ctrl para arrastrar la pila completa.", + "block-cherry-picking/@info-macContextDisabled": "En macOS, use la tecla Cmd en vez de Ctrl.", + "block-cherry-picking/@name": "Agarrar un único bloque con tecla Ctrl", + "block-cherry-picking/@settings-name-invertDrag": "Revertir controles", + "hide-new-variables/@description": "No crear automáticamente monitores para variables y listas nuevas.", + "hide-new-variables/@name": "Esconder variables nuevas", + "editor-extra-keys/@description": "Añade más teclas a los menús desplegables de los bloques \"¿tecla () presionada?\" y \"al presionar tecla ()\", como enter, coma, y más. Estas teclas incluso funcionarán para usuarios que no tengan este addon.", + "editor-extra-keys/@info-experimentalKeysWarn": "Las \"teclas experimentales\" incluyen signo igual, barra, punto y coma y más. Pueden no funcionar en todos los sistemas operativos o diseños de teclado.", + "editor-extra-keys/@info-shiftKeysWarn": "Las \"teclas Shift\" incluyen teclas que típicamente requieren la tecla Shift y una tecla de número, como hashtag, símbolo de exclamación y más. Estas teclas solo funcionan con el bloque \"al presionar tecla ()\" y no funcionan en todos los sistemas operativos o diseños de teclado.", + "editor-extra-keys/@name": "Opciones de teclas extra", + "editor-extra-keys/@settings-name-experimentalKeys": "Mostrar teclas experimentales", + "editor-extra-keys/@settings-name-shiftKeys": "Mostrar teclas Shift", + "hide-delete-button/@description": "Esconde el botón de eliminar (ícono de bote de basura) de objetos, disfraces y sonidos. Estos pueden seguirse eliminando utilizando el menú contextual al dar click derecho.", + "hide-delete-button/@name": "Esconder botón de eliminar", + "hide-delete-button/@settings-name-costumes": "Disfraces y fondos", + "hide-delete-button/@settings-name-sounds": "Sonidos", + "hide-delete-button/@settings-name-sprites": "Objetos", + "no-script-bumping/@description": "Permite que los scripts sean movidos y modificados sin causar que scripts superpuestos se muevan.", + "no-script-bumping/@name": "No espaciar automáticamente scripts superpuestos", + "disable-stage-drag-select/@description": "Elimina la posibilidad de arrastrar objetos en el escenario, exceptuando aquellos fijados explícitamente como arrastrables. Presione Shift mientras arrastra un objeto para moverlo normalmente.", + "disable-stage-drag-select/@name": "Objetos no arrastrables en el editor", + "move-to-top-bottom/@description": "Agrega opciones al menú de click derecho para mover un disfraz o sonido a la primera o última posición de la lista.", + "move-to-top-bottom/@info-developer-tools": "Este addon era parte de \"herramientas de desarrollador\", pero se ha mudado aquí.", + "move-to-top-bottom/@name": "Mover disfraz a la cima o al fondo", + "disable-paste-offset/@description": "Pega items copiados en su posición original en vez de movidos levemente en el editor de disfraces.", + "disable-paste-offset/@info-vanilla": "Este comportamiento también puede ser logrado sin este addon mediante Alt+Click a un objeto.", + "disable-paste-offset/@name": "No mover items pegados", + "block-duplicate/@description": "Duplique rápidamente un script arrastrándolo mientras mantiene la tecla Alt. Apriete Ctrl también para solo duplicar un bloque en vez de toda la pila adjunta debajo.", + "block-duplicate/@info-mac": "En macOS, use la tecla Option en vez de la tecla Alt y la tecla Command en vez de la tecla Control.", + "block-duplicate/@name": "Duplicar script con tecla Alt", + "rename-broadcasts/@description": "Añade una opción para renombrar mensajes en los menús desplegables de los bloques de transmisión de mensajes.", + "rename-broadcasts/@name": "Renombrar mensajes", + "swap-local-global/@description": "Agrega más opciones al renombrar una variable o lista existente: permite cambiar entre \"Para todos los objetos\" y \"Solo para este objeto\" y si las variables son almacenadas en la nube. También agrega una nueva opción al hacer click derecho en una variable/lista para cambiar rápidamente su ámbito.", + "swap-local-global/@name": "Cambiar variables entre \"Para todos los objetos\" y \"Solo para este objeto\"", + "editor-comment-previews/@description": "Le permite previsualizar los contenidos de comentarios al poner el cursor sobre comentarios encogidos y bloques. Puede usar esto para ver comentarios que están fuera de la pantalla, identificar un bloque bucle desde el final por su previsualización, meter muchos comentarios en un lugar pequeño y más.", + "editor-comment-previews/@name": "Previsualización de comentarios del editor", + "editor-comment-previews/@settings-name-delay": "Tiempo de retardo", + "editor-comment-previews/@settings-name-follow-mouse": "Seguir cursor", + "editor-comment-previews/@settings-name-hover-view": "Poner el cursor sobre comentarios encogidos para previsualizar", + "editor-comment-previews/@settings-name-hover-view-block": "Poner cursor sobre bloques para previsualizar comentarios enganchados", + "editor-comment-previews/@settings-name-hover-view-procedure": "Poner cursor sobre bloques personalizados para previsualizar comentarios en su definición", + "editor-comment-previews/@settings-name-reduce-animation": "Reducir animación", + "editor-comment-previews/@settings-name-reduce-transparency": "Reducir transparencia", + "editor-comment-previews/@settings-select-delay-long": "Largo", + "editor-comment-previews/@settings-select-delay-none": "Ninguno", + "editor-comment-previews/@settings-select-delay-short": "Corto", + "columns/@description": "Divide el menú de categorías de bloques en dos columnas y lo mueve a la cima de la paleta de bloques, como en Scratch 2.0.", + "columns/@name": "Menú de categorías de dos columnas", + "number-pad/@description": "Mostrar el teclado numérico de Scratch cuando se editen campos numéricos en cualquier dispositivo, en vez de solo en los con pantalla táctil.", + "number-pad/@info-explanation": "Un teclado numérico se mostrará cuando se editen campos numéricos de ciertos bloques, como \"dar a x el valor\".", + "number-pad/@name": "Siempre mostrar teclado numérico", + "script-snap/@description": "Arrastre un script para automáticamente ajustar su posición a los puntos del área de código.", + "script-snap/@name": "Ajustar scripts a cuadrícula", + "script-snap/@preset-name-default": "Predeterminado", + "script-snap/@preset-name-half-block": "Medio bloque", + "script-snap/@preset-name-whole-block": "Bloque entero", + "script-snap/@settings-name-grid": "Tamaño de la grilla (px)", + "fullscreen/@description": "Arregla algunos efectos no deseados del modo de pantalla completa del reproductor de proyectos, abre el reproductor en modo de pantalla completa de su navegador y esconde la barra de herramientas de bandera verde.", + "fullscreen/@info-hideToolbarNotice": "Si elige esconder la barra de herramientas, recuerde que puede usar la tecla Esc para salir del modo de pantalla completa.", + "fullscreen/@name": "Pantalla completa mejorada", + "fullscreen/@settings-name-browserFullscreen": "Abrir reproductor de proyectos en modo pantalla completa del navegador", + "fullscreen/@settings-name-hideToolbar": "Esconder barra de herramientas en pantalla completa", + "hide-stage/@description": "Agrega un botón al lado de los botones de \"escenario pequeño\" y \"escenario grande\" que esconde el escenario y el panel de objetos, haciendo mucho más grande el área de código.", + "hide-stage/@name": "Esconder escenario y panel de objetos", + "editor-stepping/@description": "Agrega un borde colorido a los bloques que están ejecutándose actualmente en un proyecto.", + "editor-stepping/@name": "Borde de bloque en ejecución", + "editor-stepping/@settings-name-highlight-color": "Color de destacado" +} \ No newline at end of file diff --git a/src/addons/addons-l10n-settings/fr.json b/src/addons/addons-l10n-settings/fr.json new file mode 100644 index 0000000000000000000000000000000000000000..841648278f564bacb85c13385965e7ce802e27a0 --- /dev/null +++ b/src/addons/addons-l10n-settings/fr.json @@ -0,0 +1,319 @@ +{ + "cat-blocks/@description": "Ramène les blocs chapeaux avec une tête de chat, venant du poisson d'avril 2020.", + "cat-blocks/@info-watch": "L'option \"regarder le curseur\" peut impacter les performances quand l'éditeur est ouvert.", + "cat-blocks/@name": "Blocs chat", + "cat-blocks/@settings-name-watch": "Regarder le curseur", + "editor-devtools/@name": "Outils pour développeurs", + "editor-devtools/@settings-name-enableCleanUpPlus": "Améliorer l'option \"Nettoyer les blocs\"", + "editor-devtools/@settings-name-enablePasteBlocksAtMouse": "Coller les blocs à l'emplacement du curseur", + "find-bar/@description": "Ajoute une barre de recherche à côté de l'onglet des son pour rechercher et accéder à des scripts, costumes et sons. Utilisez Ctrl + Flèche gauche et Ctrl + Flèche droite dans la zone de code pour naviguer vers la position précédente ou suivante après avoir utilisé la barre de recherche.", + "find-bar/@info-developer-tools": "Cet addon faisait auparavant partie de l'addon \"outils de développement\" mais a été déplacé ici.", + "find-bar/@name": "Barre de recherche de l'éditeur", + "middle-click-popup/@description": "Cliquez au milieu de la zone de code, utilisez Ctrl+Espace ou Shift+Clic pour faire apparaître une boîte de saisie flottante dans laquelle vous pouvez taper le nom d'un bloc (ou des parties de celui-ci) et faire glisser le bloc dans la zone de code. Maintenez la touche Maj tout en faisant glisser le bloc pour éviter de fermer la boîte lorsque vous ajoutez plusieurs blocs à la fois.", + "middle-click-popup/@info-developer-tools": "Cet addon faisait auparavant partie de l'addon \"developer tools\" mais a été déplacé ici.", + "middle-click-popup/@name": "Insérer des blocs par nom", + "jump-to-def/@description": "Permet d'accéder à la définition d'un bloc personnalisé à l'aide du bouton central de la souris ou de Maj + Clic sur le bloc.", + "jump-to-def/@info-developer-tools": "Cet addon faisait auparavant partie de l'addon \"outils de développement\" mais a été déplacé ici.", + "jump-to-def/@name": "Accéder à la définition d'un bloc personnalisé", + "editor-searchable-dropdowns/@description": "Vous permet d'afficher une liste déroulante pour rechercher des blocs.", + "editor-searchable-dropdowns/@name": "Menus déroulants recherchables", + "data-category-tweaks-v2/@description": "Apporte des améliorations pour la catégorie des blocs de donnée (\"Variables\") dans l'éditeur.", + "data-category-tweaks-v2/@name": "Améliorations pour la catégorie des blocs de donnée", + "data-category-tweaks-v2/@settings-name-moveReportersDown": "Déplacer les blocs au dessus de la liste des variables", + "data-category-tweaks-v2/@settings-name-separateListCategory": "Catégorie séparée pour les listes", + "data-category-tweaks-v2/@settings-name-separateLocalVariables": "Séparer les variables uniques aux sprites", + "block-palette-icons/@description": "Ajoute des icônes dans les cercles colorés qui identifient les catégories de blocs", + "block-palette-icons/@name": "Icônes des catégories de la palette des blocs", + "hide-flyout/@description": "Cache la palette des blocs si elle n'est pas survolée. Cliquez sur l'icône de cadenas pour la maintenir en place temporairement. Sinon, utilisez le mode \"Clic sur la catégorie\".", + "hide-flyout/@info-hoverExplanation": "Le mode \"Survol de la palette\" n'étend seulement la zone affichée. Si vous voulez pouvoir glisser les blocs dans cette zone sans qu'ils soient supprimés, utilisez un des autres modes.", + "hide-flyout/@name": "Masquer automatiquement la palette de blocs", + "hide-flyout/@settings-name-speed": "Vitesse d’animation", + "hide-flyout/@settings-name-toggle": "Activer...", + "hide-flyout/@settings-select-speed-default": "Par défaut", + "hide-flyout/@settings-select-speed-long": "Lent", + "hide-flyout/@settings-select-speed-none": "Instantané", + "hide-flyout/@settings-select-speed-short": "Rapide", + "hide-flyout/@settings-select-toggle-category": "Au clic de la catégorie", + "hide-flyout/@settings-select-toggle-cathover": "Au survol de la catégorie", + "hide-flyout/@settings-select-toggle-hover": "Au survol de la palette", + "hide-flyout/@update": "Cet addon a été révisé et de nombreux bugs ont été corrigés.", + "mediarecorder/@description": "Ajoute un bouton \"démarrer l'enregistrement\" à la barre de menu de l'éditeur qui vous permet d'enregistrer la scène du projet.", + "mediarecorder/@name": "Enregistreur vidéo de projet", + "drag-drop/@description": "Vous permet de glisser des images ou des sons depuis votre explorateur de fichiers directement dans la listes des sprites, des sons et des costumes. Vous pouvez également faire glisser des fichiers texte dans les listes ou dans la boîte de dialogue \"demander et attendre\".", + "drag-drop/@name": "Glisser-déposer de fichier", + "drag-drop/@settings-name-use-hd-upload": "Utiliser les upload HD", + "debugger/@settings-name-log_broadcasts": "Enregistrer les envois de messages à tous les sprites", + "debugger/@settings-name-log_clear_greenflag": "Effacer logs quand le drapeau vert est cliqué", + "debugger/@settings-name-log_clone_create": "Enregistrer les créations de clone", + "debugger/@settings-name-log_failed_clone_creation": "Enregistrer le dépassement du nombre maximal de clones", + "debugger/@settings-name-log_greenflag": "Enregistrer les clics du drapeau vert", + "debugger/@update": "Nouveaux onglets \"Processus\" et \"Performance\" dans la fenêtre du débogueur.", + "pause/@description": "Ajoute un bouton pause a côté du drapeau vert.", + "pause/@name": "Bouton pause", + "mute-project/@description": "Ctrl + Clic sur le drapeau vert pour couper/rétablir le son du projet.", + "mute-project/@info-macOS": "Sur macOS, utilisez la touche Cmd plutôt que la touche Ctrl.", + "mute-project/@name": "Mode lecture de projet en sourdine", + "vol-slider/@description": "Ajoute un curseur de volume à côté du drapeau vert.", + "vol-slider/@name": "Curseur de volume de projet", + "vol-slider/@settings-name-defVol": "Volume par défaut", + "clones/@description": "Ajoute un compteur dans l'éditeur pour voir le compte total de clones.", + "clones/@name": "Compteur de clones", + "clones/@settings-name-showicononly": "Afficher l'icône uniquement", + "mouse-pos/@description": "Affiche la position X/Y de la souris a côté du drapeau vert dans l'éditeur.", + "mouse-pos/@name": "Position de la souris", + "color-picker/@description": "Ajoute une entrée pour code hexa aux palettes de couleurs.", + "color-picker/@name": "Palette de couleurs hexa", + "remove-sprite-confirm/@description": "Vous demande si vous êtes sûrs de supprimer un sprite dans un projet.", + "remove-sprite-confirm/@name": "Confirmation pour la suppression de sprite", + "block-count/@description": "Affiche le nombre total de blocs d'un projet dans la barre de menus de l'éditeur. Faisait auparavant partie de \"nombre de sprites et de scripts\".", + "block-count/@name": "Compteur de Blocs", + "onion-skinning/@description": "Affiche des superpositions transparentes des costumes précédents ou suivants lors de l'édition d'un costume. Contrôlé par des boutons sous l'éditeur de costumes par les boutons de zoom.", + "onion-skinning/@name": "Pelure d'oignon", + "onion-skinning/@settings-name-afterTint": "Couleur du costume suivant", + "onion-skinning/@settings-name-beforeTint": "Couleur du costume précédent", + "onion-skinning/@settings-name-default": "Activer par défaut", + "onion-skinning/@settings-name-layering": "Calque par défaut", + "onion-skinning/@settings-name-mode": "Mode par défaut", + "onion-skinning/@settings-name-next": "Costumes suivants par défaut", + "onion-skinning/@settings-name-opacity": "Opacité (%)", + "onion-skinning/@settings-name-opacityStep": "Différence d'opacité (%)", + "onion-skinning/@settings-name-previous": "Costumes précédents par défaut", + "onion-skinning/@settings-select-layering-behind": "Derrière", + "onion-skinning/@settings-select-layering-front": "Devant", + "onion-skinning/@settings-select-mode-merge": "Combiner les images", + "onion-skinning/@settings-select-mode-tint": "Teinte", + "default-costume-editor-color/@description": "Modifie les couleurs par défaut et la taille du contour utilisées par l'éditeur de costumes.", + "default-costume-editor-color/@name": "Couleurs par défaut de l'éditeur de costumes personnalisables ", + "default-costume-editor-color/@settings-name-fill": "Couleur de remplissage par défaut", + "default-costume-editor-color/@settings-name-persistence": "Conserve la même couleur au lieu de la changer à chaque changement d'outil", + "default-costume-editor-color/@settings-name-stroke": "Couleur de contour par défaut", + "default-costume-editor-color/@settings-name-strokeSize": "Taille de contour par défaut", + "bitmap-copy/@description": "Vous permet de copier une image bitmap de l'éditeur d'images, pour pouvoir la coller ensuite dans d'autres sites ou logiciels.", + "bitmap-copy/@info-norightclick": "\"Clic droit → copier\" n'est pas pris en charge. Vous devez appuyer sur Ctrl + C lorsqu'une image est sélectionnée.", + "bitmap-copy/@name": "Copie des images bitmap", + "2d-color-picker/@description": "Remplace les curseurs de saturation et de luminosité par un sélecteur de couleurs 2D. Maintenez Maj. enfoncé tout en déplaçant le curseur pour changer les valeurs sur un seul axe.", + "2d-color-picker/@name": "Sélecteur de couleurs 2D", + "better-img-uploads/@description": "Ajoute un nouveau bouton au-dessus du bouton \"importer un costume\" qui convertit automatiquement les images bitmap téléchargées en images SVG (vecteur) pour éviter de perdre en qualité.", + "better-img-uploads/@info-notSuitableEdit": "Évitez d'utiliser le bouton de téléchargement HD si vous prévoyez de modifier l'image après le téléchargement.", + "better-img-uploads/@name": "Charger des images en HD", + "better-img-uploads/@settings-name-fitting": "Taille de l'image", + "better-img-uploads/@settings-select-fitting-fill": "Étirer pour remplir la scène", + "better-img-uploads/@settings-select-fitting-fit": "Étirer pour remplir la scène", + "better-img-uploads/@settings-select-fitting-full": "Taille originale", + "pick-colors-from-stage/@description": "Permet à la pipette de l'éditeur de costume de récupérer des couleur de la scène.", + "pick-colors-from-stage/@name": "Sélectionner les couleurs de l'éditeur de costumes", + "custom-block-shape/@description": "Ajustez les marges, le rayon des coins et la hauteur de l'entaille des blocs Scratch.", + "custom-block-shape/@info-paddingWarning": "Diminuer la marge est uniquement visible par vous, donc si vos projets sont vus par d'autres utilisateurs, vos scripts pourraient se chevaucher.", + "custom-block-shape/@name": "Forme de bloc personnalisable", + "custom-block-shape/@preset-description-default2": "Une apparence similaire aux blocs de Scratch 2.0", + "custom-block-shape/@preset-description-default3": "L'apparence classique des blocs de Scratch 3.0", + "custom-block-shape/@preset-description-flat2": "Les blocs de Scratch 2.0 sans entailles et coins arrondis", + "custom-block-shape/@preset-description-flat3": "Les blocs de Scratch 3.0 sans entailles et coins arrondis", + "custom-block-shape/@preset-name-default2": "Blocs 2.0", + "custom-block-shape/@preset-name-default3": "Blocs 3.0", + "custom-block-shape/@settings-name-cornerSize": "Taille des coins (0-300%)", + "custom-block-shape/@settings-name-notchSize": "Hauteur de l'entaille (0-150%)", + "custom-block-shape/@settings-name-paddingSize": "Taille de la marge (50-200%)", + "zebra-striping/@description": "Fait alterner les blocs de la même catégorie entre des nuances plus claires et plus foncées lorsqu'ils sont imbriqués les uns dans les autres. Ceci est également connu sous le nom de \"rayures zébrées\" (\"zebra striping\" en Anglais).", + "zebra-striping/@name": "Alternance de la couleur des blocs imbriqués", + "zebra-striping/@settings-name-intensity": "Intensité (0-100%)", + "zebra-striping/@settings-name-shade": "Ombre", + "zebra-striping/@settings-select-shade-darker": "Plus sombre", + "zebra-striping/@settings-select-shade-lighter": "Plus clair", + "editor-theme3/@description": "Personnalisez la couleur des blocs pour chaque catégorie de bloc dans l'éditeur.", + "editor-theme3/@name": "Couleurs de bloc personnalisables", + "editor-theme3/@preset-description-black": "Rendre l'arrière-plan des blocs noir.", + "editor-theme3/@preset-description-dark": "Version sombre des couleurs par défaut", + "editor-theme3/@preset-description-original": "Les couleurs originales des blocs de Scratch 2.0", + "editor-theme3/@preset-description-tweaks": "Évènements, Contrôles et Blocs personnalisés avec les couleurs inspirées de Scratch 2.0", + "editor-theme3/@preset-name-black": "Noir", + "editor-theme3/@preset-name-dark": "Sombre", + "editor-theme3/@preset-name-original": "Couleurs de la version Scratch 2.0", + "editor-theme3/@preset-name-tweaks": "Ajustements de la version Scratch 3.0", + "editor-theme3/@settings-name-comment-color": "Commentaires", + "editor-theme3/@settings-name-control-color": "contrôle", + "editor-theme3/@settings-name-custom-color": "personnalisé", + "editor-theme3/@settings-name-data-lists-color": "listes", + "editor-theme3/@settings-name-events-color": "événements", + "editor-theme3/@settings-name-input-color": "Entrées de blocs", + "editor-theme3/@settings-name-looks-color": "apparence", + "editor-theme3/@settings-name-motion-color": "mouvement", + "editor-theme3/@settings-name-operators-color": "opérateurs", + "editor-theme3/@settings-name-sensing-color": "capteurs", + "editor-theme3/@settings-name-sounds-color": "son", + "editor-theme3/@settings-name-text": "Couleur du texte", + "editor-theme3/@settings-select-text-black": "Noir", + "editor-theme3/@settings-select-text-colorOnBlack": "Coloré sur fond noir", + "editor-theme3/@settings-select-text-colorOnWhite": "Coloré sur fond blanc", + "editor-theme3/@settings-select-text-white": "Blanc", + "editor-theme3/@update": "Le paramètre \"Commentaires sombres\" de \"Thème sombre de l'éditeur et couleurs personnalisables\" a été déplacé ici et est maintenant personnalisable.", + "custom-block-text/@description": "Change l'épaisseur du texte des blocs et y ajoute éventuellement une ombre.", + "custom-block-text/@name": "Style de texte des blocs personnalisés", + "custom-block-text/@settings-name-bold": "Texte en gras", + "custom-block-text/@settings-name-shadow": "Ombre sous le texte", + "editor-colored-context-menus/@description": "Menus contextuels colorés quand on fait un clic droit sur un bloc.", + "editor-colored-context-menus/@name": "Menus déroulants colorés", + "editor-stage-left/@description": "Déplace la scène à gauche de l'éditeur, comme dans Scratch 2.0.", + "editor-stage-left/@info-reverseOrder": "Pour modifier la position des boutons au-dessus de la scène, utilisez l'addon \"inverser l'ordre des contrôles du projet\".", + "editor-stage-left/@name": "Afficher la scène sur le côté gauche", + "editor-buttons-reverse-order/@description": "Bouge le drapeau vert et le bouton stop sur la droite, et le bouton plein écran à la gauche, comme dans Scratch 2.0", + "editor-buttons-reverse-order/@name": "Inverse l'ordre des contrôles du projet", + "variable-manager/@description": "Ajoute un nouvel onglet à côté de \"sons\" dans l'éditeur pour mettre à jour facilement les variables et les listes.", + "variable-manager/@name": "Gestionnaire de variables", + "variable-manager/@update": "Les éléments de liste peuvent désormais être insérés sans maintenir la touche Maj enfoncée.", + "search-sprites/@description": "Ajoute un champ de recherche au volet des sprites pour les rechercher par nom.", + "search-sprites/@name": "Recherche de sprites par nom", + "sprite-properties/@description": "Cache le panneau de propriétés du sprite par défaut, comme dans Scratch 2.0. Utilisez le bouton info sur le sprite actuellement sélectionné ou double-cliquez sur un sprite pour afficher à nouveau le panneau des propriétés. Pour le réafficher, utilisez le bouton de réduction dans le panneau de propriétés ou double-cliquez sur un sprite.", + "sprite-properties/@name": "Réduire les propriétés des sprites", + "sprite-properties/@settings-name-autoCollapse": "Réduction automatique lorsque la souris quitte le panneau des sprites", + "sprite-properties/@settings-name-hideByDefault": "Réduire le panneau par défaut", + "sprite-properties/@settings-name-transitionDuration": "Vitesse d’animation", + "sprite-properties/@settings-select-transitionDuration-default": "Par défaut", + "sprite-properties/@settings-select-transitionDuration-long": "Lent", + "sprite-properties/@settings-select-transitionDuration-none": "Instantané", + "sprite-properties/@settings-select-transitionDuration-short": "Rapide", + "gamepad/@description": "Interagissez avec les projets en utilisant une manette USB ou Bluetooth.", + "gamepad/@name": "Support manette", + "gamepad/@settings-name-hide": "Cacher le bouton des paramètres lorsque aucune manette n'est détectée", + "editor-sounds/@description": "Produit un son lorsque vous connectez ou supprimez des blocs.", + "editor-sounds/@name": "Effets sonores dans l'éditeur", + "folders/@description": "Ajoute des dossiers au volet sprite, ainsi que dans les listes de costumes et de sons. Pour créer un dossier, faites un clic droit sur n'importe quel sprite et cliquez sur \"créer un dossier\". Appuyez sur un dossier pour l'ouvrir ou le fermer. Faites un clic droit sur un sprite pour voir dans quels dossiers vous pouvez le déplacer, ou faites-le glisser et déposez-le dans un dossier ouvert. Cette fonctionnalité fonctionne en ajoutant \"[NomDuDossier]//\" au début des noms de vos sprites.", + "folders/@info-notice-folders-are-public": "Les utilisateurs ayant cette fonctionnalité activée seront capables de voir les dossiers présents dans vos projets. N'importe qui d'autre verra la liste des sprites normalement (sans les dossiers).", + "folders/@name": "Dossiers de sprites", + "block-switching/@description": "Faites un clic droit sur un bloc pour le remplacer par un autre bloc associé.", + "block-switching/@name": "Échanger de bloc", + "block-switching/@settings-name-control": "Blocs de contrôle", + "block-switching/@settings-name-customargs": "Arguments de bloc personnalisés", + "block-switching/@settings-name-customargsmode": "Options d'arguments de bloc personnalisés affichées", + "block-switching/@settings-name-data": "Blocs de données", + "block-switching/@settings-name-event": "Blocs d'événements", + "block-switching/@settings-name-extension": "Blocs d'extension", + "block-switching/@settings-name-looks": "Blocs d'apparence", + "block-switching/@settings-name-motion": "Blocs de mouvement", + "block-switching/@settings-name-noop": "Afficher la possibilité de remplacer le bloc par lui-même", + "block-switching/@settings-name-operator": "Blocs d'opérateurs", + "block-switching/@settings-name-sensing": "Blocs de capteurs", + "block-switching/@settings-name-sound": "Blocs de son", + "block-switching/@settings-select-customargsmode-all": "Arguments dans tous les blocs personnalisés du sprite", + "block-switching/@settings-select-customargsmode-defOnly": "Arguments dans le bloc personnalisé actuel", + "load-extensions/@description": "Ouvre automatiquement la musique, le stylet et d'autres extensions dans le menu des catégories de blocs de l'éditeur.", + "load-extensions/@name": "Ajout automatique d'extensions", + "load-extensions/@settings-name-music": "Musique", + "load-extensions/@settings-name-pen": "Stylo", + "load-extensions/@settings-name-text2speech": "Synthèse Vocale", + "load-extensions/@settings-name-translate": "Traduire", + "custom-zoom/@description": "Ajuste le minimum, le maximum, la vitesse et la taille de base du zoom dans l'éditeur de code du projet, et cache automatiquement les contrôles.", + "custom-zoom/@name": "Zoom de la zone de code personnalisable", + "custom-zoom/@settings-name-autohide": "Masquer automatiquement les contrôles pour le zoom", + "custom-zoom/@settings-name-maxZoom": "Zoom maximum (100-500%)", + "custom-zoom/@settings-name-minZoom": "Zoom minimum (1-100 %)", + "custom-zoom/@settings-name-startZoom": "Zoom de base (50-500 %)", + "custom-zoom/@settings-name-zoomSpeed": "Vitesse du zoom (50-200 %)", + "custom-zoom/@settings-select-speed-default": "Par défaut", + "custom-zoom/@settings-select-speed-long": "Lent", + "custom-zoom/@settings-select-speed-none": "Instantané", + "custom-zoom/@settings-select-speed-short": "Rapide", + "initialise-sprite-position/@description": "Changer les position par défaut des ordonnées et abscisses lors de la création d'un nouveau costume", + "initialise-sprite-position/@name": "Position d'un nouveau sprite personnalisable", + "initialise-sprite-position/@settings-name-duplicate": "Comportement lors de la duplication de sprites", + "initialise-sprite-position/@settings-name-library": "Place les sprites de la bibliothèque aléatoirement", + "initialise-sprite-position/@settings-name-x": "Abscisse x", + "initialise-sprite-position/@settings-name-y": "Ordonnée y", + "initialise-sprite-position/@settings-select-duplicate-custom": "Envoyer aux valeurs x/y spécifiées", + "initialise-sprite-position/@settings-select-duplicate-keep": "Identique au sprite d'origine", + "initialise-sprite-position/@settings-select-duplicate-randomize": "Randomiser", + "blocks2image/@description": "Faites un clic droit sur la zone de code de l'éditeur pour exporter les blocs sous formes d'images SVG / PNG.", + "blocks2image/@name": "Enregistrer les blocs en tant qu'image", + "remove-curved-stage-border/@description": "Enlève les bords arrondis de la scène, vous permettant de voir les coins.", + "remove-curved-stage-border/@name": "Enlever les bords arrondis de la scène", + "transparent-orphans/@description": "Ajuste la transparence des blocs dans l'éditeur, avec des options séparées pour les blocs orphelins (ceux sans chapeau en haut de la pile) et les blocs qui sont déplacés.", + "transparent-orphans/@name": "Transparence des blocs", + "transparent-orphans/@settings-name-block": "Transparence des blocs (%)", + "transparent-orphans/@settings-name-dragged": "Transparence des blocs déplacés (%)", + "transparent-orphans/@settings-name-orphan": "Transparence des blocs orphelins (%)", + "paint-by-default/@description": "Modifie l'action par défaut des boutons \"Choisir un Sprite/Costume/Backdrop/Son\", qui ouvrent la bibliothèque par défaut.", + "paint-by-default/@name": "Éditeur de costume par défaut", + "paint-by-default/@settings-name-backdrop": "Ajouter un arrière-plan", + "paint-by-default/@settings-name-costume": "Ajouter un costume", + "paint-by-default/@settings-name-sound": "Ajouter un son", + "paint-by-default/@settings-name-sprite": "Ajouter un sprite", + "paint-by-default/@settings-select-backdrop-library": "Bibliothèque", + "paint-by-default/@settings-select-backdrop-paint": "Peindre", + "paint-by-default/@settings-select-backdrop-upload": "Importer", + "paint-by-default/@settings-select-costume-library": "Bibliothèque", + "paint-by-default/@settings-select-costume-paint": "Peindre", + "paint-by-default/@settings-select-costume-upload": "Importer", + "paint-by-default/@settings-select-sound-library": "Bibliothèque", + "paint-by-default/@settings-select-sound-record": "Enregistrer", + "paint-by-default/@settings-select-sound-upload": "Importer", + "paint-by-default/@settings-select-sprite-library": "Bibliothèque", + "paint-by-default/@settings-select-sprite-paint": "Peindre", + "paint-by-default/@settings-select-sprite-upload": "Importer", + "block-cherry-picking/@description": "Ajoutes la possibilité de déplacé les blocs un par un avec la touche Ctrl (plutôt que le script le suivant)", + "block-cherry-picking/@info-flipControls": "Si les \"contrôles inversés\" sont activés, la saisie de blocs individuellement sera activer par défaut. Maintenez la touche Ctrl enfoncée pour faire glisser toute la pile.", + "block-cherry-picking/@info-macContextDisabled": "Sur macOS, utilisé la touche cmd plutôt que la touche Ctrl.", + "block-cherry-picking/@name": "Prendre un seul bloc avec la touche Ctrl", + "block-cherry-picking/@settings-name-invertDrag": "Contrôle inversé", + "hide-new-variables/@description": "N'affiche pas automatiquement les nouvelles variables ou listes.", + "hide-new-variables/@name": "Masquer les nouvelles variables", + "editor-extra-keys/@description": "Ajoute plus de touches aux listes déroulantes des blocs \"touche () pressée ?\" et \"quand la touche () est pressée\", telles qu'entrée, point, virgule, etc. Ces touches marcheront même pour les utilisateurs qui n'ont pas cet addon.", + "editor-extra-keys/@info-experimentalKeysWarn": "Les « touches expérimentales » comprennent le égale, le slash, le point-virgule et plus encore. Ils peuvent ne pas fonctionner sur tous les systèmes d'exploitation ou toutes les configurations de clavier.", + "editor-extra-keys/@info-shiftKeysWarn": "Les « touches Shift ou Maj.» incluent des touches qui nécessitent généralement la touche Shift ou Maj. et une touche numérique, comme le hashtag, le point d'exclamation, etc. Ces touches ne fonctionnent qu'avec le bloc « quand la touche () est pressée» et ne fonctionnent pas sur tous les systèmes d'exploitation ou configurations de clavier.", + "editor-extra-keys/@name": "Prise en charge de touches supplémentaire", + "editor-extra-keys/@settings-name-experimentalKeys": "Afficher les touches expérimentales", + "editor-extra-keys/@settings-name-shiftKeys": "Afficher les touches Maj et Shift.", + "hide-delete-button/@description": "Masque le bouton de suppression (icône de la corbeille) des sprites, costumes et sons. Ils peuvent toujours être supprimés à l'aide du clic droit.", + "hide-delete-button/@name": "Cacher le bouton supprimer", + "hide-delete-button/@settings-name-costumes": "Costumes et fond d'écrans", + "hide-delete-button/@settings-name-sounds": "Sons", + "hide-delete-button/@settings-name-sprites": "Lutin", + "no-script-bumping/@description": "Permet aux scripts d'être déplacés et modifiés sans provoquer le déplacement des scripts qui se chevauchent.", + "no-script-bumping/@name": "Ne pas espacer automatiquement les scripts qui se chevauchent", + "disable-stage-drag-select/@description": "Supprime la possibilité de faire glisser des sprites sur la scène dans l'éditeur, à l'exception de ceux explicitement définis comme déplaçables. Maintenez la touche Maj enfoncée tout en faisant glisser un sprite pour le déplacer normalement.", + "disable-stage-drag-select/@name": "Sprites non glissables dans l'éditeur", + "move-to-top-bottom/@description": "Ajouter une option au menu du clic droit des costumes et des sons pour les déplacer en haut ou en bas de la liste.", + "move-to-top-bottom/@info-developer-tools": "Cet addon faisait auparavant partie de l'addon \"outils de développement\" mais a été déplacé ici.", + "move-to-top-bottom/@name": "Déplacer le costume en haut ou en bas", + "disable-paste-offset/@description": "Collez les éléments copiés à leur position d'origine au lieu de les déplacer légèrement dans l'éditeur de costumes.", + "disable-paste-offset/@info-vanilla": "Ce comportement peut également être obtenu sans cet addon en faisant Alt+clic sur l'élément.", + "disable-paste-offset/@name": "Ne pas déplacer les éléments collés", + "block-duplicate/@description": "Dupliquez rapidement un script en le déplaçant tout en maintenant la touche Alt enfoncée. Maintenez la touche Ctrl enfoncée pour ne dupliquer qu'un seul bloc au lieu de toute la pile attachée en dessous.", + "block-duplicate/@info-mac": "Sur macOS, utilisez la touche Option au lieu de la touche Alt et la touche Commande au lieu de la touche Contrôle.", + "block-duplicate/@name": "Dupliquer le script avec la touche Alt", + "rename-broadcasts/@description": "Ajoute une option pour renommer les messages de diffusion dans le menu déroulant de ces blocs.", + "rename-broadcasts/@name": "Renommer les diffusions", + "swap-local-global/@description": "Ajoute plus d'options lors du renommage d'une variable ou d'une liste existante : permet de basculer entre « Pour tous les sprites » et « Pour ce sprite uniquement » et si les variables sont stockées dans le cloud. Ajoute également une nouvelle option lors d'un clic droit sur une variable/liste pour changer rapidement sa portée.", + "swap-local-global/@name": "Basculer les variables entre \"Pour tous les sprites\" et \"Pour ce sprite uniquement.", + "editor-comment-previews/@description": "Vous permet de prévisualiser le contenu des commentaires en survolant les commentaires et blocs réduits. Vous pouvez l'utiliser pour afficher les commentaires hors écran, identifier un bloc de boucle à partir du bas par son aperçu, insérer de nombreux commentaires longs dans un petit espace, etc.", + "editor-comment-previews/@name": "Prévisualisation des commentaires dans l'éditeur", + "editor-comment-previews/@settings-name-delay": "Durée du délai", + "editor-comment-previews/@settings-name-follow-mouse": "Suivre le pointeur de souris", + "editor-comment-previews/@settings-name-hover-view": "Survolez les commentaires réduits pour prévisualiser", + "editor-comment-previews/@settings-name-hover-view-block": "Survolez les blocs pour prévisualiser les commentaires joints", + "editor-comment-previews/@settings-name-hover-view-procedure": "Survolez les blocs personnalisés pour prévisualiser les commentaires de définition", + "editor-comment-previews/@settings-name-reduce-animation": "Réduire l'animation", + "editor-comment-previews/@settings-name-reduce-transparency": "Réduire la transparence", + "editor-comment-previews/@settings-select-delay-none": "Aucun", + "editor-comment-previews/@settings-select-delay-short": "Court", + "columns/@description": "Divise le menu des catégories de blocs en deux colonnes et le déplace vers le haut de la palette de blocs, comme dans Scratch 2.0", + "columns/@name": "Menu catégorie à deux colonnes", + "number-pad/@description": "Afficher l'entrée du pavé numérique de Scratch lors de l'édition des champs numériques sur tous les appareils, au lieu de seulement l'afficher sur les appareils à écran tactile.", + "number-pad/@info-explanation": "Un pavé numérique s'affichera lors de l'édition des entrées numériques de certains blocs, comme \"set x to\".", + "number-pad/@name": "Toujours afficher le pavé numérique", + "script-snap/@description": "Les script vont automatiquement s'aligner sur les points de l'arrière-plan.", + "script-snap/@name": "Aligner les scripts sur la grille", + "script-snap/@preset-name-default": "Par défaut", + "script-snap/@preset-name-half-block": "Demi-bloc", + "script-snap/@preset-name-whole-block": "Bloc entier", + "script-snap/@settings-name-grid": "Taille de la grille (pixels)", + "fullscreen/@description": "Corrige certains effets indésirables dans le mode plein écran des projets, l'ouvre dans le mode plein écran de votre navigateur et masque la barre d'outils du drapeau vert.", + "fullscreen/@info-hideToolbarNotice": "Si vous choisissez de masquer la barre d'outils, n'oubliez pas que vous pouvez utiliser la touche Échap pour quitter le mode plein écran du projet", + "fullscreen/@name": "Plein écran amélioré", + "fullscreen/@settings-name-browserFullscreen": "Ouvrir le projet en mode plein écran", + "fullscreen/@settings-name-hideToolbar": "Masquer la bar d'outils en grand écran", + "hide-stage/@description": "Ajoute un bouton à côté des boutons \"petite scène\" et \"grande scène\" qui cache la scène et la liste des sprites, rendant la zone de code plus grande.", + "hide-stage/@name": "Cacher la scène et la liste des sprites", + "editor-stepping/@description": "Ajoute un contour bleu sur les blocs qui sont actuellement exécutés dans un projet.", + "editor-stepping/@name": "Bordure du bloc executé", + "editor-stepping/@settings-name-highlight-color": "Couleurs de surbrillance" +} \ No newline at end of file diff --git a/src/addons/addons-l10n-settings/hu.json b/src/addons/addons-l10n-settings/hu.json new file mode 100644 index 0000000000000000000000000000000000000000..7902291187d415690f2567c5bfd3aaadd93d3cc0 --- /dev/null +++ b/src/addons/addons-l10n-settings/hu.json @@ -0,0 +1,344 @@ +{ + "cat-blocks/@description": "Visszahozza a szerkesztőbe a macskás kinézetű kezdőblokkokat a 2020-as Áprilisi Bolondok napról.", + "cat-blocks/@info-watch": "A \"Figyeld az egérmutatót\" opció hatással lehet a teljesítményre, miközben a szerkesztő meg van nyitva.", + "cat-blocks/@name": "Cica-blokkok", + "cat-blocks/@settings-name-watch": "Figyeld az egérmutatót", + "editor-devtools/@description": "Hozzáad új menüopciókat a szerkesztőhöz: másolj/illessz be blokkokat, jobb rendrakás, és még sok más!", + "editor-devtools/@name": "Fejlesztői eszközök", + "editor-devtools/@settings-name-enableCleanUpPlus": "Fejlesztett \"Rendrakás\"", + "editor-devtools/@settings-name-enablePasteBlocksAtMouse": "Blokkok beillesztése a kurzorhoz", + "find-bar/@description": "Hozzáad egy keresőmezőt a hang fültől jobbra, ami megkeresi és odavisz egy adott kód részhez, jelmezhez vagy hanghoz. Használd a Ctrl+Bal-t és Ctrl+Jobb-ot a kód mezőben, hogy navigálj az előfordulások között.", + "find-bar/@info-developer-tools": "Ez a bővítmény korábban a \"Fejlesztői eszközök\" bővítmény része volt, de mostanra át lett helyezve ide.", + "find-bar/@name": "Szerkesztő keresőmező", + "middle-click-popup/@description": "Középső egérgombbal kattintás a kódterületre, Ctrl+Szóköz vagy Shift+Kattintás használatakor felugrik egy lebegő bemeneti mező, ahova be lehet írni egy blokk nevét (vagy nevének részeit), majd azt ki is lehet a kódterületre húzni. Tartsd a Shiftet lenyomva egy blokk kihúzása közben, hogy nyitva maradjon a mező, s több blokk is hozzáadható lehessen egyszerre.", + "middle-click-popup/@info-developer-tools": "Ez a kiegészítő korábban a „fejlesztői eszközök” része volt, de most ide költözött.", + "middle-click-popup/@name": "Blokkok beillesztése név alapján", + "jump-to-def/@description": "Megengedi, hogy egy egyéni blokk definiálásához ugorj a középső egérgombbal, vagy Shift+Kattintással az adott blokkon.", + "jump-to-def/@info-developer-tools": "Ez a bővítmény korábban a \"Fejlesztői eszközök\" bővítmény része volt, de mostanra át lett helyezve ide.", + "jump-to-def/@name": "Ugrás egyéni blokk definiálásához", + "editor-searchable-dropdowns/@description": "Megengedi, hogy keress a blokkok legördülő menüiben.", + "editor-searchable-dropdowns/@name": "Keresés a legördülő menükben", + "data-category-tweaks-v2/@description": "Igazításokat hajt végre az Adat (\"Változók\") blokk kategórián.", + "data-category-tweaks-v2/@name": "Adat kategória igazítások", + "data-category-tweaks-v2/@settings-name-moveReportersDown": "Adat blokkok mozgatása a váltózó lista fölé", + "data-category-tweaks-v2/@settings-name-separateListCategory": "Különálló Lista Kategória", + "data-category-tweaks-v2/@settings-name-separateLocalVariables": "Adott szereplő változóinak elkülönítése", + "block-palette-icons/@description": "Ikonokat helyez el a színes körökben, amelyekkel könnyebben azonosíthatod a kategóriákat.", + "block-palette-icons/@name": "Blokk választó kategória ikonok", + "hide-flyout/@description": "Elrejti a blokk választót, ha nem felette van a kurzor. Kattints a lakat ikonra, hogy átmenetileg zárold a pozícióját. Alternatívaként használd a \"kategória kattintásra\" módot.", + "hide-flyout/@info-hoverExplanation": "A \"kurzor a választó felület felett\" mód csak a látóteredet növeli meg. Ha oda is szeretnél húzni blokkokat a törlődésük nélkül, akkor használj egy másik módot.", + "hide-flyout/@name": "Blokk választó automatikus elrejtése", + "hide-flyout/@settings-name-speed": "Animáció sebessége", + "hide-flyout/@settings-name-toggle": "Váltás ha...", + "hide-flyout/@settings-select-speed-default": "Alap", + "hide-flyout/@settings-select-speed-long": "Lassú", + "hide-flyout/@settings-select-speed-none": "Azonnali", + "hide-flyout/@settings-select-speed-short": "Gyors", + "hide-flyout/@settings-select-toggle-category": "Kategória kattintásra", + "hide-flyout/@settings-select-toggle-cathover": "Kurzor a kategóriák felett", + "hide-flyout/@settings-select-toggle-hover": "Kurzor a választó felület felett", + "hide-flyout/@update": "Erre a kiegészítőre átdolgozás került sorra, amely során sok hiba javítva lett.", + "mediarecorder/@description": "Hozzáad egy \"felvétel indítása\" gombot a szerkesztő menü sorába, ami megengedi, hogy felvedd a projekt színpadját.", + "mediarecorder/@name": "Projekt videó felvevő", + "drag-drop/@description": "Elérhetővé teszi, hogy behúzzál képeket és hangokat a fájlkezelődből a szereplők táblába, vagy a jelmezek/hangok nevű oldalsávba. Még szövegfájlokat is be tudsz húzni listákba, vagy a \"kérdezd meg és várj\" blokk bemeneteli szövegét.", + "drag-drop/@name": "Fájlok behúzása", + "drag-drop/@settings-name-use-hd-upload": "Használja a HD feltöltést", + "debugger/@name": "Hibakereső", + "debugger/@settings-name-log_broadcasts": "Üzenetküldések naplózása", + "debugger/@settings-name-log_clear_greenflag": "Zöld zászlóra való kattintáskor jegyzetek kitörlése", + "debugger/@settings-name-log_clone_create": "Másolat-készítés feljegyzése", + "debugger/@settings-name-log_failed_clone_creation": "Klónok maximum számának elérésének feljegyzése", + "debugger/@settings-name-log_greenflag": "Zöld zászlóra való kattintás naplózása", + "debugger/@update": "Új \"Szálak\" és \"Teljesítmény\" fülek a hibakereső ablakban.", + "pause/@description": "Hozzáad egy megállítás gombot a zöld zászló mellé.", + "pause/@name": "Megállítás gomb", + "mute-project/@description": "Ctrl+Kattints a zöld zászlóra, hogy némítsd/feloldd a némítást egy projektben.", + "mute-project/@info-macOS": "MacOS-en használja a Cmd billentyűt a Ctrl helyett.", + "mute-project/@name": "Némított projekt lejátszó mód", + "vol-slider/@description": "Hozzáad egy hangcsúszkát a zöld zászló mellé", + "vol-slider/@name": "Projekt-hangerőcsúszka", + "vol-slider/@settings-name-defVol": "Alapértelmezett hangerő", + "clones/@description": "Hozzáad egy számlálót a szerkesztőhöz a színpad fölé, ami megmutatja a másolatok számát.", + "clones/@name": "Másolatszámláló", + "clones/@settings-name-showicononly": "Csak az ikon megjelenítése", + "mouse-pos/@description": "Megjeleníti az egered x és y helyét a színpad fölött a szerkesztőben.", + "mouse-pos/@name": "Egér pozíciója", + "color-picker/@description": "Hozzáad egy hexadecimális kódbemenetet a színválasztókhoz.", + "color-picker/@name": "Hex szín választó", + "remove-sprite-confirm/@description": "Megkérdezi egy projekten belüli szereplő törölésénél, hogy biztos vagy-e benne.", + "remove-sprite-confirm/@name": "Szereplő törlésének megerősítése", + "block-count/@description": "Megmutatja hány blokk van összesen egy projektben a szerkesztő menü bárjában. Korábban a \"szereplők és kódok száma\" részét képezte.", + "block-count/@name": "Blokkok száma", + "onion-skinning/@description": "Áttetsző rétegekként mutatja az előző illetve következő jelmezeket, amikor jelmezt szerkesztesz. Gombokkal irányítható, amik a jelmez szerkesztő alatt vannak a zoom gombok mellett.", + "onion-skinning/@settings-name-afterTint": "Következő jelmez árnyalata", + "onion-skinning/@settings-name-beforeTint": "Előző jelmez árnyalata", + "onion-skinning/@settings-name-default": "Alapvető engedélyezés", + "onion-skinning/@settings-name-layering": "Alapvető rétegezés", + "onion-skinning/@settings-name-mode": "Alapvető mód", + "onion-skinning/@settings-name-next": "Alapvető következő jelmezek", + "onion-skinning/@settings-name-opacity": "Átlátszatlanság (%)", + "onion-skinning/@settings-name-opacityStep": "Átlátszatlanság Változás (%)", + "onion-skinning/@settings-name-previous": "Alapvető előző jelmezek", + "onion-skinning/@settings-select-layering-behind": "Mögé", + "onion-skinning/@settings-select-layering-front": "Elé", + "onion-skinning/@settings-select-mode-merge": "Képek összeolvasztása", + "onion-skinning/@settings-select-mode-tint": "Szín árnyalás", + "paint-snap/@description": "Illessz objektumokat a körülvevő mezőkhöz és vektorvégpontokhoz a jelmezszerkesztőben .", + "paint-snap/@name": "Illesztés a jelmezszerkesztőben", + "paint-snap/@settings-name-boxCenter": "Illesztés a kijelölés középpontjától", + "paint-snap/@settings-name-boxCorners": "Illesztés a kijelölés sarkaitól", + "paint-snap/@settings-name-boxEdgeMids": "Illesztés a kijelölés széleinek középpontjától", + "paint-snap/@settings-name-enable-default": "Automatikus bekapcsolása", + "paint-snap/@settings-name-guide-color": "Illesztésmutató színe", + "paint-snap/@settings-name-objectCenters": "Illesztés az objektumok középpontjához", + "paint-snap/@settings-name-objectCorners": "Illesztés az objektumok sarkaihoz", + "paint-snap/@settings-name-objectEdges": "Illesztés az objektumok széleihez", + "paint-snap/@settings-name-objectMidlines": "Illesztés az objektumok középvonalához", + "paint-snap/@settings-name-pageAxes": "Illesztés a lap x és y tengelyeihez", + "paint-snap/@settings-name-pageCenter": "Illesztés a lap középpontjához", + "paint-snap/@settings-name-pageCorners": "Illesztés a lap sarkaihoz", + "paint-snap/@settings-name-pageEdges": "Illesztés a lap széleihez", + "paint-snap/@settings-name-threshold": "Illesztési távolság", + "default-costume-editor-color/@description": "Megváltoztatja az alap színeit és körvonal méreteit a jelmezszerkesztőnek.", + "default-costume-editor-color/@name": "Személyre szabható alapértelmezett jelmezszerkesztőszínek", + "default-costume-editor-color/@settings-name-fill": "Alapkitöltőszín", + "default-costume-editor-color/@settings-name-persistence": "Használja az előző színt eszközváltásnál, alaphelyzetbe állás helyett", + "default-costume-editor-color/@settings-name-stroke": "Alapkörvonalszín", + "default-costume-editor-color/@settings-name-strokeSize": "Alapkörvonal-méret", + "bitmap-copy/@description": "Engedélyezi, hogy kimásolj a rendszer vágólapjára egy bitmap képet a Scratch szerkesztőjében, amit aztán be tudsz illeszteni más weboldalaknál, vagy alkalmazásoknál.", + "bitmap-copy/@info-norightclick": "A \"Jobb kattintás → másolás\" nem támogatott. Ctrl+C-t kell nyomjál, miközben ki van jelölve egy bitmap kép.", + "bitmap-copy/@name": "Bitmap képek másolása", + "2d-color-picker/@description": "Kicseréli egy 2D-s színválasztóra a telítettség és fényerő csúszkákat a szereplők szerkesztőjében. Tartsd lenyomva a Shiftet miközben húzod az egérmutatót, hogy csak egy tengely mentén változtassad a színértéket.", + "2d-color-picker/@name": "2D-s színválasztó", + "better-img-uploads/@description": "Hozzáad egy új gombot a \"Jelmez feltöltése\" gomb fölé, ami automatikusan átalakítja a feltöltött bitmap képeket SVG (vektorgrafikus formátum) képekké, így azok nem vesztenek a minőségükből.", + "better-img-uploads/@info-notSuitableEdit": "Kerüld el a HD feltöltés opciót, ha még módosítani szeretnéd utána a képet.", + "better-img-uploads/@name": "HD minőségű képek feltöltése", + "better-img-uploads/@settings-name-fitting": "Kép méretezése", + "better-img-uploads/@settings-select-fitting-fill": "Kinyújtás, hogy kitöltse a színpadot", + "better-img-uploads/@settings-select-fitting-fit": "Összezsugorítással illesztés a színpadhoz", + "better-img-uploads/@settings-select-fitting-full": "Eredeti méret", + "pick-colors-from-stage/@description": "Lehetővé teszi a jelmez szerkesztő pipetta eszközének, hogy a színpadról is felvehessen színeket.", + "pick-colors-from-stage/@name": "Háttér színének választása a jelmez szerkesztőben", + "custom-block-shape/@description": "Állítsd be a kipárnázást, sarok sugarat, és a bemetszés magasságát a blokkokon.", + "custom-block-shape/@info-paddingWarning": "A kipárnázás méretének csökkentése csak általad látható, szóval ha a projektjeidet mások tekintik meg, a kódjaid lehet, hogy fedni fogják egymást.", + "custom-block-shape/@name": "Személyre szabható blokk forma", + "custom-block-shape/@preset-description-default2": "Egy olyan kinézet, amely hasonlít a Scratch 2.0 blokkjaihoz", + "custom-block-shape/@preset-description-default3": "A Scratch 3.0 alapértelmezett blokk kinézetei", + "custom-block-shape/@preset-description-flat2": "A Scratch 2.0 blokkjai bemetszés és sarkak nélkül", + "custom-block-shape/@preset-description-flat3": "A Scratch 3.0 blokkjai bemetszés és sarkak nélkül", + "custom-block-shape/@preset-name-default2": "2.0ás blokkok", + "custom-block-shape/@preset-name-default3": "3.0-ás blokkok", + "custom-block-shape/@preset-name-flat2": "2.0 Lapos", + "custom-block-shape/@preset-name-flat3": "3.0 Lapos", + "custom-block-shape/@settings-name-cornerSize": "Sarok méret (0-300%)", + "custom-block-shape/@settings-name-notchSize": "Bemetszés magassága (0-150%)", + "custom-block-shape/@settings-name-paddingSize": "Kipárnázás mérete (50-200%)", + "zebra-striping/@description": "Használatkor az ugyanazon blokk kategóriából származó blokkok színei váltakoznak világosabb és sötétebb árnyalatok között, amikor egymásba vannak ágyazva. Ezt úgy is nevezik, hogy zebra csíkozás.", + "zebra-striping/@name": "Váltakozó egymásba ágyazott blokk színek", + "zebra-striping/@settings-name-intensity": "Intenzitás (0-100%)", + "zebra-striping/@settings-name-shade": "Árnyalat", + "zebra-striping/@settings-select-shade-darker": "Sötétebb", + "zebra-striping/@settings-select-shade-lighter": "Világosabb", + "editor-theme3/@description": "Szerkeszd a blokkok színeit kategóriánként a szerkesztőben.", + "editor-theme3/@name": "Személyre szabható blokk színek", + "editor-theme3/@preset-description-black": "Sötétté teszi a blokkok háttereit", + "editor-theme3/@preset-description-dark": "Az alapvető színek sötétebb változatai", + "editor-theme3/@preset-description-original": "A Scratch 2.0 eredeti blokk színei", + "editor-theme3/@preset-description-tweaks": "Események, Vezérlés és Blokkjaim kategóriák blokkjai 2.0 inspirálta színekkel.", + "editor-theme3/@preset-name-black": "Fekete", + "editor-theme3/@preset-name-dark": "Sötét", + "editor-theme3/@preset-name-original": "2.0-ás Színek", + "editor-theme3/@preset-name-tweaks": "3.0 Kis Igazítással", + "editor-theme3/@settings-name-Pen-color": "Bővítmények", + "editor-theme3/@settings-name-comment-color": "Kommentek", + "editor-theme3/@settings-name-control-color": "Vezérlés", + "editor-theme3/@settings-name-custom-color": "Blokkjaim", + "editor-theme3/@settings-name-data-color": "Változók", + "editor-theme3/@settings-name-data-lists-color": "Listák", + "editor-theme3/@settings-name-events-color": "Események", + "editor-theme3/@settings-name-input-color": "Blokk bemenetek", + "editor-theme3/@settings-name-looks-color": "Kinézet", + "editor-theme3/@settings-name-motion-color": "Mozgás", + "editor-theme3/@settings-name-operators-color": "Műveletek", + "editor-theme3/@settings-name-sensing-color": "Érzékelés", + "editor-theme3/@settings-name-sounds-color": "Hangok", + "editor-theme3/@settings-name-text": "Szöveg színe", + "editor-theme3/@settings-select-text-black": "Fekete", + "editor-theme3/@settings-select-text-colorOnBlack": "Színes fekete háttéren", + "editor-theme3/@settings-select-text-colorOnWhite": "Színes fehér háttéren", + "editor-theme3/@settings-select-text-white": "Fehér", + "editor-theme3/@update": "A \"Sötét kommentek\" beállítás a \"Szerkesztő sötét mód és személyre szabható színek\" bővítményből ide lett áthelyezve és most már személyre szabható.", + "custom-block-text/@description": "Megváltoztatja a szövegek vastagságát a blokkokon és ezen kívül opcionális árnyékot is adhatsz a szövegekhez.", + "custom-block-text/@name": "Személyre szabható blokk szöveg stílus", + "custom-block-text/@settings-name-bold": "Félkövér szöveg", + "custom-block-text/@settings-name-shadow": "Árnyék a szöveg alatt", + "editor-colored-context-menus/@description": "Átszínezi a blokkok jobb kattintásra megjelenő helyi menüjét.", + "editor-colored-context-menus/@name": "Színezett helyi menük", + "editor-stage-left/@description": "Áthelyezi a színpadot a szerkesztő baloldalára, ahogy a Scratch 2.0-ban volt.", + "editor-stage-left/@info-reverseOrder": "A színpad fölötti gombok elhelyezésének változtatásához használd a „Projektirányító gombok fordított sorrendben” kiegészítőt.", + "editor-stage-left/@name": "Színpad áthelyezése bal oldalra", + "editor-buttons-reverse-order/@description": "Áthelyezi a zöld zászlót és a megállító gombot a jobboldalra, valamint a teljes képernyő gombot pedig baloldalra, ahogy a Scratch 2.0-ban volt.", + "editor-buttons-reverse-order/@name": "Projektirányító gombok fordított sorrendben", + "variable-manager/@description": "Hozzáad egy fület a \"hangok\" mellé a szerkesztőben, melyben könnyen frissítheted a változókat és listákat.", + "variable-manager/@name": "Változó kezelő", + "variable-manager/@update": "Lista elemek már Shift nyomvatartása nélkül is beszúrhatók.", + "search-sprites/@description": "Hozzáad egy kereső mezőt a szereplő kijelzőhőz, hogy kereshess a szereplők között név alapján.", + "search-sprites/@name": "Szereplők keresése név alapján", + "sprite-properties/@description": "Elrejti alapértelmezetten a szereplőjellemzők panelt, mint a Scratch 2.0-ban. Használd az információs gombot az éppen kiválasztott szereplőnél vagy kattints duplán egy szereplőre, hogy előbújtasd ismét a tulajdonságokat mutató panelt. Az újra-elrejtéséhez pedig használd az összecsukó gombot a panelen, vagy kattints kétszer egy szereplőre.", + "sprite-properties/@name": "Összecsukható szereplőjellemzők", + "sprite-properties/@settings-name-autoCollapse": "Csukódjon automatikusan, amikor az egér elhagyja a szereplői panelt", + "sprite-properties/@settings-name-hideByDefault": "Panel összecsukása alapból", + "sprite-properties/@settings-name-transitionDuration": "Animáció sebessége", + "sprite-properties/@settings-select-transitionDuration-default": "Alapértelmezett", + "sprite-properties/@settings-select-transitionDuration-long": "Lassú", + "sprite-properties/@settings-select-transitionDuration-none": "Azonnali", + "sprite-properties/@settings-select-transitionDuration-short": "Gyors", + "gamepad/@description": "Lépj kapcsolatba projektekkel USB, vagy Bluetooth kontroller/gamepad használata által.", + "gamepad/@name": "Gamepad támogatás", + "gamepad/@settings-name-hide": "Tüntesd el a beállítások gombot, amikor nem érzékelhetők kontrollerek", + "editor-sounds/@description": "Hangeffekteket játszik le, amikor csatlakoztatsz, vagy kitörölsz blokkokat.", + "editor-sounds/@name": "Szerkesztő hangeffektekkel", + "folders/@description": "Mappákat ad a szereplő kijelzőhöz, illetve a jelmez és hang listához. Mappa létrehozásához, jobb kattints bármely szereplőre és kattints a \"mappa létrehozása\" lehetőségre. Kattints egy mappára, hogy megnyisd vagy összezárd azt. Jobb kattints egy szereplőre, hogy lásd milyen mappákba tudod átmozgatni, vagy csak húzd az egérrel egy nyitott mappába. Ez a funkció a szerepelők neveinek elé a következő hozzáadásával érhető el: \"[mappa neve]//\".", + "folders/@info-notice-folders-are-public": "Azok a felhasználók, akiknek be van kapcsolva ez a bővítmény láthatják a mappákat a projektjeidben. Bárki más normálisan fogja látni a szereplő kijelzőt (mappák nélkül).", + "folders/@name": "Szereplő mappák", + "block-switching/@description": "Jobb klikk egy blokkra, hogy lecserélhesd egy hozzá kapcsolódó blokkra.", + "block-switching/@name": "Blokk lecserélés", + "block-switching/@settings-name-control": "Vezérlés blokkok", + "block-switching/@settings-name-customargs": "Saját blokk független változói", + "block-switching/@settings-name-customargsmode": "Mutatott saját blokk bemenetválasztása", + "block-switching/@settings-name-data": "Adat blokkok", + "block-switching/@settings-name-event": "Esemény blokkok", + "block-switching/@settings-name-extension": "Kiegészítő blokkok", + "block-switching/@settings-name-looks": "Kinézet blokkok", + "block-switching/@settings-name-motion": "Mozgás blokkok", + "block-switching/@settings-name-noop": "Saját magára állító opció mutatása", + "block-switching/@settings-name-operator": "Művelet blokkok", + "block-switching/@settings-name-sensing": "Érzékelés blokkok", + "block-switching/@settings-name-sound": "Hang blokkok", + "block-switching/@settings-select-customargsmode-all": "A szereplő összes bemenetei között", + "block-switching/@settings-select-customargsmode-defOnly": "Csak az adott saját blokknak bemenetei között", + "load-extensions/@description": "Automatikusan megjeleníti a zene, toll, és más bővítményeket a szerkesztő oldalsó blokk kategóriás menüjében.", + "load-extensions/@name": "Automatikusan add hozzá a bővítményeket", + "load-extensions/@settings-name-music": "Zene", + "load-extensions/@settings-name-pen": "Toll", + "load-extensions/@settings-name-text2speech": "Text to Speech (Szöveget Beszéddé)", + "load-extensions/@settings-name-translate": "Fordítás", + "custom-zoom/@description": "Válassz egyedi beállításokat a kódterület nagyításának minimumára, maximumára, sebességére és indító méretére, valamint rejtsd el az irányító gombokat hozzá", + "custom-zoom/@name": "Szemelyre szabható kódterület nagyítása", + "custom-zoom/@settings-name-autohide": "Nagyítás irányítógombjainak automatikus elrejtése", + "custom-zoom/@settings-name-maxZoom": "Maximum nagyítás (100-500%)", + "custom-zoom/@settings-name-minZoom": "Minimum nagyítás (1-100%)", + "custom-zoom/@settings-name-speed": "Animáció sebességének automatikus elrejtése", + "custom-zoom/@settings-name-startZoom": "Kezdeti nagyítás (50-500%)", + "custom-zoom/@settings-name-zoomSpeed": "Nagyítási sebesség (50-200%)", + "custom-zoom/@settings-select-speed-default": "Alapértelmezett", + "custom-zoom/@settings-select-speed-long": "Lassú", + "custom-zoom/@settings-select-speed-none": "Azonnali", + "custom-zoom/@settings-select-speed-short": "Gyors", + "initialise-sprite-position/@description": "Megváltoztatja az alapértelmezett x/y pozícióját az újonnan készített szereplőknek", + "initialise-sprite-position/@name": "Személyre szabható pozíció az új szereplőknek", + "initialise-sprite-position/@settings-name-duplicate": "Szereplőduplikáláskori viselkedés", + "initialise-sprite-position/@settings-name-library": "Könyvtárból betöltött szereplők pozíciójának véletlenszerűsítése", + "initialise-sprite-position/@settings-name-x": "X pozíció", + "initialise-sprite-position/@settings-name-y": "Y pozíció", + "initialise-sprite-position/@settings-select-duplicate-custom": "Meghatározott x/y értékekhez küldés", + "initialise-sprite-position/@settings-select-duplicate-keep": "Az eredeti szereplőnek megfelelőnél tartása", + "initialise-sprite-position/@settings-select-duplicate-randomize": "Véletlenszerűsítés", + "blocks2image/@description": "Jobb kattintás a kódterületre, hogy exportálni lehessen a blokkokat SVG/PNG képekként", + "blocks2image/@name": "Blokkokmentése képként", + "remove-curved-stage-border/@description": "Eltávolítja az íveltségét a színpad széleinek, így láthatóvá téve a sarkokban lévő dolgokat is.", + "remove-curved-stage-border/@name": "Színpad lekerekített sarkainak eltávolítása", + "transparent-orphans/@description": "Állítsd be kedvedre az átlátszóságát a blokkoknak a szerkesztőben különféle opciókkal a magányos blokkok részére (akik nem kapcsolódnak kezdeti blokkhoz) és a húzott blokkok részére is.", + "transparent-orphans/@name": "Blokk átlátszóság", + "transparent-orphans/@settings-name-block": "Blokk átlátszóság (%)", + "transparent-orphans/@settings-name-dragged": "Húzottak átlátszósága (%)", + "transparent-orphans/@settings-name-orphan": "Magányosok átlátszósága (%)", + "paint-by-default/@description": "Átéllítja az alapvető műveletet a \"Válassz Szereplőt/Jelmezt/Hátteret/Hangot\" gomboknak, amik alapvetően a könyvtárat nyitják meg.", + "paint-by-default/@name": "Jelmez festése alapvetően", + "paint-by-default/@settings-name-backdrop": "Háttér hozzáadása", + "paint-by-default/@settings-name-costume": "Jelmez hozzáadása", + "paint-by-default/@settings-name-sound": "Hang hozzáadása", + "paint-by-default/@settings-name-sprite": "Szereplő hozzáadása", + "paint-by-default/@settings-select-backdrop-library": "Könyvtár", + "paint-by-default/@settings-select-backdrop-paint": "Festés", + "paint-by-default/@settings-select-backdrop-surprise": "Meglepetés", + "paint-by-default/@settings-select-backdrop-upload": "Feltöltés", + "paint-by-default/@settings-select-costume-library": "Könyvtár", + "paint-by-default/@settings-select-costume-paint": "Festés", + "paint-by-default/@settings-select-costume-surprise": "Meglepetés", + "paint-by-default/@settings-select-costume-upload": "Feltöltés", + "paint-by-default/@settings-select-sound-library": "Könyvtár", + "paint-by-default/@settings-select-sound-record": "Felvétel", + "paint-by-default/@settings-select-sound-surprise": "Meglepetés", + "paint-by-default/@settings-select-sound-upload": "Feltöltés", + "paint-by-default/@settings-select-sprite-library": "Könyvtár", + "paint-by-default/@settings-select-sprite-paint": "Festés", + "paint-by-default/@settings-select-sprite-surprise": "Meglepetés", + "paint-by-default/@settings-select-sprite-upload": "Feltöltés", + "block-cherry-picking/@description": "Hozzáadja a képességet, hogy kihúzhass egy blokkot egy kódsor közepéről, (ahelyett, hogy az egész parancssort mozgatnád, ami alatta van) amíg a Ctrl-t nyomva tartod.", + "block-cherry-picking/@info-flipControls": "Ha a \"fordított irányítás\" engedélyezve van, akkor a blokkok egyedülálló megfogása alapvető viselkedés lesz. Tartsd lenyomva a Ctrl-t, ha az egész kódsort mozgatni szeretnéd.", + "block-cherry-picking/@info-macContextDisabled": "A macOS-on, használd a Cmd gombot a Ctrl helyett.", + "block-cherry-picking/@name": "Egy blokk megfogása Ctrl gombbal", + "block-cherry-picking/@settings-name-invertDrag": "Fordított irányítás", + "hide-new-variables/@description": "Ne készíts automatikusan kijelzőket az újonnan készített változóknak vagy listáknak.", + "hide-new-variables/@name": "Új változók elrejtése", + "editor-extra-keys/@description": "Több billentyűvel bővíti a „() gomb lenyomva?” és a „() gomb lenyomásakor” blokk lenyíló listáját, mint például sz enterrel, a ponttal, a vesszővel, de még többel is. Ezek a gombok működni fognak azoknak a szereplőknek is, akiknek nincs meg ez a kiegészítő", + "editor-extra-keys/@info-experimentalKeysWarn": "A \"kísérleti gombok\" tartalmaz egyenlőségjelet, perjelet, pontosvesszőt és még pár irásjelet. Ezek lehet nem működnek minden operációs rendszeren vagy billentyűzet nyelvezetben.", + "editor-extra-keys/@info-shiftKeysWarn": "A \"Shift billentyűk\" tartalmaznak olyan billentyűket, amiket a Shift billentyű nyomvatartásakor lehet csak begépelni, ilyen a hashtag, a felkijáltójel és még pár. Ezek a billentyűk csak a \"() gomb lenyomásakor\" bolkkal működnek és nem működnek minden operációs rendszeren illetve billentyűzeten.", + "editor-extra-keys/@name": "Extra billentyűopciók", + "editor-extra-keys/@settings-name-experimentalKeys": "Mutassa a kísérleti billentyűket is", + "editor-extra-keys/@settings-name-shiftKeys": "Mutassa a Shiftes billentyűket is (angol billentyűzeten)", + "hide-delete-button/@description": "Elrejti a törlés gombot (kuka ikont) a szereplőkből, jelmezekből és hangokból. Ezután még törölhetőek lesznek a jobb kattos helyi menüből.", + "hide-delete-button/@name": "Törlés gomb elrejtése", + "hide-delete-button/@settings-name-costumes": "Jelmezek és hátterek", + "hide-delete-button/@settings-name-sounds": "Hangok", + "hide-delete-button/@settings-name-sprites": "Szereplők", + "no-script-bumping/@description": "Megengedi a kódok mozgatását anélkül, hogy odébb mozdulnának az egymást fedő kódoszlopok.", + "no-script-bumping/@name": "Ne mozgasd automatikusan a kódokat", + "disable-stage-drag-select/@description": "Eltávolítja a lehetőséget, hogy áthelyezd a szereplőket a színpadon, kivéve azoknál, amik kifejezetten húzogathatóvá lettek beállítva. Tarsd lenyomva a Shiftet egy szereplő megragadása közben, hogy áthelyezhesd normálisan.", + "disable-stage-drag-select/@name": "Nem-mozdítható szereplők a szerkesztőben", + "move-to-top-bottom/@description": "Hozzáad egy opctiót a jobb katt index menüjéhez a jelmezek és hangok mozgatására a lista legtetejére vagy legaljára.", + "move-to-top-bottom/@info-developer-tools": "Ez a bővítmény korábban a \"Fejlesztői eszközök\" bővítmény része volt, de mostanra át lett helyezve ide.", + "move-to-top-bottom/@name": "Jelmez áthelyezése legfelülre vagy legalulra", + "disable-paste-offset/@description": "A bemásolt elemeket az eredeti helyükre kerülnek, nem tolódnak el a jelmez szerkesztőben.", + "disable-paste-offset/@info-vanilla": "Ez a viselkedés elérhető ezen kiegészítő nélkül is Alt+Kattintással az elemre", + "disable-paste-offset/@name": "Ne helyezd át a bemásolt elemeket", + "block-duplicate/@description": "Duplikálj egy kódot gyorsan azzal, hogy az Alt lenyomva tartása közben mozgatod. Ha a Ctrl-t is nyomva tartod, akkor csak egy blokkot duplikálsz az egész alatta levő blokk sor helyett.", + "block-duplicate/@info-mac": "A macOS-on, használd az Option gombot Alt helyett és a Command gombot a Control helyett.", + "block-duplicate/@name": "Kód duplikálása Alt gombbal", + "swap-local-global/@description": "További opciókat ad hozzá a már létező változók vagy listák átnevezésénél: megengedi a váltást \"Minden szereplőé\" és \"A kiválasztott szereplőé\" között, állítható továbbá a változók megosztottsága. Hozzáad még egy új opciót, amikor jobb kattintasz egy változót/listát, hogy gyorsabban állíthasd az elérhetőségét.", + "swap-local-global/@name": "Változók váltása \"Minden szereplőé\" és \"A kiválasztott szereplé\" között", + "editor-comment-previews/@description": "Megengedi, hogy megtekintsd a kommentek tartalmát azzal, hogy fölé viszed az egered egy összecsukott kommentnek vagy blokknak. Ezzel elolvashatsz képernyőn kívüli kommenteket, azonosíthatsz egy ismétlő blokkot az aljáról az előnézet alapján, sok hosszú komment elhelyezése kis helyen, és további lehetőségek.", + "editor-comment-previews/@name": "Szerkesztői komment előnézetek", + "editor-comment-previews/@settings-name-delay": "Késleltetés időtartama", + "editor-comment-previews/@settings-name-follow-mouse": "Egér követése", + "editor-comment-previews/@settings-name-hover-view": "Tartsd az egeret egy összecsukott komment fölött az előnézethez", + "editor-comment-previews/@settings-name-hover-view-block": "Tartsd az egeret egy blokk fölé, hogy megtekintsd a csatolt kommenteket", + "editor-comment-previews/@settings-name-hover-view-procedure": "Tartsd az egeret egy saját blokk fölé, hogy megtekintsd a definícióhoz fűzött kommenteket", + "editor-comment-previews/@settings-name-reduce-animation": "Animáció csökkentése", + "editor-comment-previews/@settings-name-reduce-transparency": "Átlátszóság csökkentése", + "editor-comment-previews/@settings-select-delay-long": "Hosszú", + "editor-comment-previews/@settings-select-delay-none": "Nincs", + "editor-comment-previews/@settings-select-delay-short": "Rövid", + "columns/@description": "Felosztja a blokk kategória menüt két oszlopra és a blokk választó tetejére helyezi, mint a Scratch 2.0-ban.", + "columns/@name": "Két oszlopos kategória menü", + "number-pad/@description": "Mindig megjeleníti minden eszközön a Scratch számbillentyűzet-bemenetét szám-mezők szerkesztésénél, ahelyett, hogy csak érintőképernyőseknél tenné meg.", + "number-pad/@info-explanation": "Egy számbillentyűzet fog megjelenni számterületi bemenetek szerkesztésénél, mint amilyen az \"x legyen\" blokknál van.", + "number-pad/@name": "Mindig mutass számbillentyűzetet", + "script-snap/@description": "Mozgass egy kódot és automatikusan a kód mező pontjaihoz fog igazodni.", + "script-snap/@name": "Kódok rácspontokhoz való igazítása", + "script-snap/@preset-name-default": "Alap", + "script-snap/@preset-name-half-block": "Fél-blokk", + "script-snap/@preset-name-whole-block": "Egész-blokk", + "script-snap/@settings-name-grid": "Rács méret (px)", + "fullscreen/@description": "Kijavít pár nemkívánatos effektet a projekt lejátszó teljes képernyős módjában, megnyitja a böngésződ teljes képernyős módjában, és elrejti a zöld zászlós eszköztárat.", + "fullscreen/@info-hideToolbarNotice": "Ha kiválasztod az eszköztár elrejtését, emlékezz hogy úgy léphetsz ki a projekt lejátszó teljes képernyős módjából, hogy megnyomod az Esc gombot.", + "fullscreen/@name": "Fejlesztett teljes képernyő", + "fullscreen/@settings-name-browserFullscreen": "Teljes képernyős projekt lejátszó megnyitása a böngésző teljes képernyős módjában", + "fullscreen/@settings-name-hideToolbar": "Eszköztár elrejtése teljes képernyőben", + "hide-stage/@description": "Egy gombot ad hozzá a \"kicsi színpad\" és \"nagy színpad\" gombok mellé, ami a színpad és a szereplőmező elrejtésével jelentős mértékben megnöveli a kódterületet.", + "hide-stage/@name": "A Színpad és a Szereplőmező elrejtése", + "editor-stepping/@description": "Hozzáad egy színes körvonalat azon blokkokhoz, amik éppen futnak egy projektben.", + "editor-stepping/@name": "Futó blokkok körvonalai", + "editor-stepping/@settings-name-highlight-color": "Kiemelés színe" +} \ No newline at end of file diff --git a/src/addons/addons-l10n-settings/it.json b/src/addons/addons-l10n-settings/it.json new file mode 100644 index 0000000000000000000000000000000000000000..060730b9a284ac1dbbfcad584563ba9bc1e5e47d --- /dev/null +++ b/src/addons/addons-l10n-settings/it.json @@ -0,0 +1,344 @@ +{ + "cat-blocks/@description": "Mostra nell'editor i blocchi di tipo cappello con le orecchie del gatto che erano comparsi come Pesce di Aprile 2020.", + "cat-blocks/@info-watch": "L'impostazione \"Guarda il puntatore del mouse\" può avere un certo impatto sulla performance quando l'editor è aperto", + "cat-blocks/@name": "Cappelli con le orecchie del gatto", + "cat-blocks/@settings-name-watch": "Guarda il puntatore del mouse", + "editor-devtools/@description": "Aggiunge nuove opzioni nei menu dell'editor: copia/incolla dei blocchi, riordino degli script migliorato, e molto altro!", + "editor-devtools/@name": "Strumenti per sviluppatori", + "editor-devtools/@settings-name-enableCleanUpPlus": "Migliora \"Riordina i Blocchi\"", + "editor-devtools/@settings-name-enablePasteBlocksAtMouse": "Incolla i blocchi dove si trova il puntatore del mouse.", + "find-bar/@description": "Aggiunge una barra di ricerca a fianco alla scheda suoni per trovare script, costumi e suoni e per passare direttamente agli elementi trovati. Usa Ctrl+Sinistra a Ctrl+Destra nell'area degli script per andare alla precedente o alla seguente posizione che hai visitato dopo che hai usato la barra di ricerca.", + "find-bar/@info-developer-tools": " Questo addon faceva parte in precedenza dell'addon \"strumenti per sviluppatori\" ma è stato spostato qui.", + "find-bar/@name": "Barra di ricerca dell'editor", + "middle-click-popup/@description": "Cliccando con il tasto centrale nell'area degli script oppure usando Ctrl+Spazio o Shift+Click puoi far comparire una casella dove digitare il nome di un blocco (o parte del nome) e trascinare il blocco nell'area del codice. Se vuoi aggiungere più di un blocco e non non vuoi che la casella si chiuda mentre lo trascini, tieni premuto Shift mentre lo trascini.", + "middle-click-popup/@info-developer-tools": " Questo addon faceva parte in precedenza dell'addon \"strumenti per sviluppatori\" ma è stato spostato qui.", + "middle-click-popup/@name": "Inserisci il nome dei blocchi ", + "jump-to-def/@description": "Ti permette di andare alla definizione di un blocco personalizzato usando il pulsante centrale del mouse oppure cliccando il blocco mentre si preme Shift.", + "jump-to-def/@info-developer-tools": "Questo addon faceva parte in precedenza dell'addon \"strumenti per sviluppatori\" ma è stato spostato qui.", + "jump-to-def/@name": "Vai alla definizione del blocco personalizzato", + "editor-searchable-dropdowns/@description": "TI permette di cercare nel menu contestuale dei blocchi", + "editor-searchable-dropdowns/@name": "Ricerca nei Menu drop-down", + "data-category-tweaks-v2/@description": "Modifica nell'editor la categoria \"Variabili\".", + "data-category-tweaks-v2/@name": "Modifiche per la categoria Variabili", + "data-category-tweaks-v2/@settings-name-moveReportersDown": "Muovi blocchi dati sopra alla lista delle variabili", + "data-category-tweaks-v2/@settings-name-separateListCategory": "Categoria Liste separata", + "data-category-tweaks-v2/@settings-name-separateLocalVariables": "Separa Variabili Solo per lo Sprite", + "block-palette-icons/@description": "Aggiunge delle icone all'interno dei cerchi colorati che identificano le categorie dei blocchi.", + "block-palette-icons/@name": "Icone per le categorie del pannello dei blocchi", + "hide-flyout/@description": "Nasconde il pannello dei blocchi se non è a contatto con il mouse. Clicca il lucchetto per bloccarlo temporaneamente. In alternativa, usa la modalità \"Clic categoria\".", + "hide-flyout/@info-hoverExplanation": "La modalità \"Movimento del mouse sull'area dei blocchi\" estende soltanto l'area degli script. Se vuoi poter trascinarvi i blocchi in questa aria senza che vengano cancellati, usa una delle altre modalità.", + "hide-flyout/@name": "Nascondi pannello blocchi automaticamente", + "hide-flyout/@settings-name-speed": "Velocità animazione", + "hide-flyout/@settings-name-toggle": "Nascondi quando...", + "hide-flyout/@settings-select-speed-default": "Predefinita", + "hide-flyout/@settings-select-speed-long": "Lenta", + "hide-flyout/@settings-select-speed-none": "Istantanea", + "hide-flyout/@settings-select-speed-short": "Veloce", + "hide-flyout/@settings-select-toggle-category": "Clic categoria", + "hide-flyout/@settings-select-toggle-cathover": "Movimento del mouse sull'area delle categorie", + "hide-flyout/@settings-select-toggle-hover": "Movimento del mouse sull'area dei blocchi", + "hide-flyout/@update": "Questo addon è stato rivisto e sono stati corretti molti bug.", + "mediarecorder/@description": "Aggiunge all’editor un pulsante “Avvia registrazione” che permette di registrare cioè che avviene sullo stage del progetto.", + "mediarecorder/@name": "Registratore video progetti", + "drag-drop/@description": "TI permette di trascinare immagini e suoni da una cartella nella lista degli sprite o dei costumi/suoni. Puoi anche trascinare file di testo su una lista o nella casella dei blocchi \"chiedi e attendi\".", + "drag-drop/@name": "Trascinamento file", + "drag-drop/@settings-name-use-hd-upload": "Usa importazione di immagini HD", + "debugger/@settings-name-log_broadcasts": "Registra nei log l'invio di messaggi", + "debugger/@settings-name-log_clear_greenflag": "Svuota i log quando si clicca la bandiera verde", + "debugger/@settings-name-log_clone_create": "Registra nei log la creazione di cloni", + "debugger/@settings-name-log_failed_clone_creation": "Registra nei log quando si supera il massimo dei cloni ammessi ", + "debugger/@settings-name-log_greenflag": "Registra nei log i click della bandiera verde", + "debugger/@update": "Nuove schede \"Thread\" e \"Performance\" nella finestra del debugger.", + "pause/@description": "Aggiunge un tasto pausa accanto alla bandiera verde.", + "pause/@name": "Pulsante Pausa", + "mute-project/@description": "Ctrl+Clic sulla bandiera verde per attivare o disattivare l'audio del progetto.", + "mute-project/@info-macOS": "In macOS usa il tasto Cmd invece del tasto Ctrl.", + "mute-project/@name": "Modalità dell'editor di progetti con audio disattivato", + "vol-slider/@description": "Aggiunge un cursore per il volume vicino ai controlli della bandiera verde.", + "vol-slider/@name": "Cursore volume progetto ", + "vol-slider/@settings-name-defVol": "Volume predefinito", + "clones/@description": "Mostra sopra lo stage dell'editor il numero totale di cloni.", + "clones/@name": "Numero dei cloni", + "clones/@settings-name-showicononly": "Mostra solo icona", + "mouse-pos/@description": "Mostra la posizione x/y del mouse sopra lo stage dell'editor.", + "mouse-pos/@name": "Posizione del mouse", + "color-picker/@description": "Aggiunge la selezione del colore esadecimale alla selezione dei colori.", + "color-picker/@name": "Selettore colore esadecimale", + "remove-sprite-confirm/@description": "Chiede conferma quando cancelli uno sprite di un progetto.", + "remove-sprite-confirm/@name": "Conferma cancellazione sprite", + "block-count/@description": "Mostra il numero totale di blocchi del progetto nella barra dei menu dell'editori. Incluso in precedenza in \"numero di sprite e di script\"", + "block-count/@name": "Numero dei blocchi", + "onion-skinning/@description": "Mostra anteprime dei costumi precedenti o seguenti nell'editor dei costumi. Puoi controllarlo con i tasti al di sotto dell'editor di costumi, accanto ai tasti per lo zoom.", + "onion-skinning/@name": "Onion Skin", + "onion-skinning/@settings-name-afterTint": "Tinta del costume seguente", + "onion-skinning/@settings-name-beforeTint": "Tinta del costume precedente", + "onion-skinning/@settings-name-default": "Attiva per impostazione predefinita", + "onion-skinning/@settings-name-layering": "Livello predefinito", + "onion-skinning/@settings-name-mode": "Modalità predefinita", + "onion-skinning/@settings-name-next": "Costumi seguenti predefiniti", + "onion-skinning/@settings-name-opacity": "Opacità (%)", + "onion-skinning/@settings-name-opacityStep": "Livello opacità (%)", + "onion-skinning/@settings-name-previous": "Costumi precedenti predefiniti", + "onion-skinning/@settings-select-layering-behind": "Secondo piano", + "onion-skinning/@settings-select-layering-front": "Primo piano", + "onion-skinning/@settings-select-mode-merge": "Unisci immagini", + "onion-skinning/@settings-select-mode-tint": "Tinta colore", + "paint-snap/@description": "Allinea gli oggetti dell'editor dei costumi ai riquadri che bordano gli oggetti e ai nodi degli elementi vettoriali", + "paint-snap/@name": "Editor dei costumi magnetico", + "paint-snap/@settings-name-boxCenter": "Attacca dal centro del riquadro di selezione", + "paint-snap/@settings-name-boxCorners": "Attacca dal bordo del riquadro di selezione", + "paint-snap/@settings-name-boxEdgeMids": "Attacca dai punti mediani dei bordi del riquadro di selezione", + "paint-snap/@settings-name-enable-default": "Abilita per impostazione predefinita", + "paint-snap/@settings-name-guide-color": "Colore della guida magnetica", + "paint-snap/@settings-name-objectCenters": "Attacca al centro degli oggetti", + "paint-snap/@settings-name-objectCorners": "Attacca agli angoli degli oggetti", + "paint-snap/@settings-name-objectEdges": "Attacca al bordo degli oggetti", + "paint-snap/@settings-name-objectMidlines": "Attacca alla linee mediane degli oggetti", + "paint-snap/@settings-name-pageAxes": "Attacca agli assi x e y della pagina", + "paint-snap/@settings-name-pageCenter": "Attacca al centro della pagina", + "paint-snap/@settings-name-pageCorners": "Attacca agli angoli della pagina", + "paint-snap/@settings-name-pageEdges": "Attacca ai bordi delle pagina", + "paint-snap/@settings-name-threshold": "Distanza magnetica", + "default-costume-editor-color/@description": "Cambia i colori e la dimensione del contorno predefiniti nell'editor di immagini.", + "default-costume-editor-color/@name": "Colori predefiniti dell'editor di immagini personalizzabili", + "default-costume-editor-color/@settings-name-fill": "Colore di riempimento predefinito", + "default-costume-editor-color/@settings-name-persistence": "Usa colore precedente invece di resettare dopo aver cambiato gli strumenti", + "default-costume-editor-color/@settings-name-stroke": "Colore di contorno predefinito", + "default-costume-editor-color/@settings-name-strokeSize": "Dimensione contorno predefinita", + "bitmap-copy/@description": "Ti permette di copiare negli appunti un'immagine bitmap dall'editor di immagini per poterla poi incollare in altri siti o in altre app.", + "bitmap-copy/@info-norightclick": "\"Clic destro → Copia\" non è supportato. Devi premere Ctrl+C quando l'immagine bitmap è selezionata.", + "bitmap-copy/@name": "Copia immagini bitmap", + "2d-color-picker/@description": "Sostituisce i cursori della saturazione e della luminosità con un selettore colori 2D. Tieni premuto Shift mentre trascini il cursore per cambiare i valori su un solo asse.", + "2d-color-picker/@name": "Selettore colori 2D", + "better-img-uploads/@description": "Aggiunge un pulsante sopra il pulsante \"carica costume\" che converte automaticamente le immagini bitmap in immagini SVG (vettoriali) durante il caricamento per evitare di perdere qualità.", + "better-img-uploads/@info-notSuitableEdit": "Evita di usare il pulsante \"carica HD\" se vuoi modificare l'immagine dopo averla caricata.", + "better-img-uploads/@name": "Caricamento di immagini HD", + "better-img-uploads/@settings-name-fitting": "Ridimensionamento immagine", + "better-img-uploads/@settings-select-fitting-fill": "Estendi per riempire lo stage", + "better-img-uploads/@settings-select-fitting-fit": "Riduci per entrare tutta nello stage", + "better-img-uploads/@settings-select-fitting-full": "Dimensione originale", + "pick-colors-from-stage/@description": "Permetti al contagocce dell'editor di costumi di selezionare colori anche dallo Stage.", + "pick-colors-from-stage/@name": "Seleziona i colori dello Stage nell'editor dei costumi", + "custom-block-shape/@description": "Modifica lo spazio interno, l'ampiezza degli angoli e l'altezza degli agganci dei blocchi di Scratch.", + "custom-block-shape/@info-paddingWarning": "La diminuzione dello spazio interno è visibile soltanto a te, quindi se i tuoi progetti vengono visualizzati da altri utenti i tuoi script potrebbero essere sovrapposti.", + "custom-block-shape/@name": "Forma dei blocchi personalizzata", + "custom-block-shape/@preset-description-default2": "Un aspetto simile ai blocchi di Scratch 2.0", + "custom-block-shape/@preset-description-default3": "L'aspetto standard dei blocchi di Scratch 3.0", + "custom-block-shape/@preset-description-flat2": "I blocchi di Scratch 2.0 senza agganci e senza angoli", + "custom-block-shape/@preset-description-flat3": "Blocchi Scratch 3.0 senza agganci e angoli", + "custom-block-shape/@preset-name-default2": "Blocchi 2.0", + "custom-block-shape/@preset-name-default3": "Blocchi 3.0", + "custom-block-shape/@preset-name-flat2": "2.0 piatti", + "custom-block-shape/@preset-name-flat3": "3.0 piatti", + "custom-block-shape/@settings-name-cornerSize": "Dimensione angoli (0-300%)", + "custom-block-shape/@settings-name-notchSize": "Altezza agganci (0-150%)", + "custom-block-shape/@settings-name-paddingSize": "Spaziatura interna (50-200%)", + "zebra-striping/@description": "Rende i blocchi della stessa categoria più chiari o più scuri quando sono annidati uno dentro l'altro. E' conosciuto anche come \"zebra striping\".", + "zebra-striping/@name": "Colorazione alternata dei blocchi annidati. ", + "zebra-striping/@settings-name-intensity": "Intensità (0-100%)", + "zebra-striping/@settings-name-shade": "Tonalità", + "zebra-striping/@settings-select-shade-darker": "Più scuro", + "zebra-striping/@settings-select-shade-lighter": "Più chiaro", + "editor-theme3/@description": "Modifica i colori dei blocchi per ogni categoria nell'editor.", + "editor-theme3/@name": "Colori blocchi personalizzabili", + "editor-theme3/@preset-description-black": "Rende nero lo sfondo dei blocchi", + "editor-theme3/@preset-description-dark": "Versione scura dei colori predefiniti", + "editor-theme3/@preset-description-original": "I colori originali di Scratch 2.0", + "editor-theme3/@preset-description-tweaks": "Situazioni, Controllo e Blocchi personalizzati con colori ispirati a 2.0", + "editor-theme3/@preset-name-black": "Nero", + "editor-theme3/@preset-name-dark": "Scuro", + "editor-theme3/@preset-name-original": "Colori 2.0", + "editor-theme3/@preset-name-tweaks": "Variazioni 3.0", + "editor-theme3/@settings-name-Pen-color": "estensioni", + "editor-theme3/@settings-name-comment-color": "Commenti", + "editor-theme3/@settings-name-control-color": "controllo", + "editor-theme3/@settings-name-custom-color": "personalizzati", + "editor-theme3/@settings-name-data-color": "variabili", + "editor-theme3/@settings-name-data-lists-color": "liste", + "editor-theme3/@settings-name-events-color": "situazioni", + "editor-theme3/@settings-name-input-color": "Argomenti dei blocchi", + "editor-theme3/@settings-name-looks-color": "aspetto", + "editor-theme3/@settings-name-motion-color": "movimento", + "editor-theme3/@settings-name-operators-color": "operatori", + "editor-theme3/@settings-name-sensing-color": "sensori", + "editor-theme3/@settings-name-sounds-color": "suoni", + "editor-theme3/@settings-name-text": "Colore del testo", + "editor-theme3/@settings-select-text-black": "Nero", + "editor-theme3/@settings-select-text-colorOnBlack": "Colorato su sfondo nero", + "editor-theme3/@settings-select-text-colorOnWhite": "Colorato su sfondo bianco", + "editor-theme3/@settings-select-text-white": "Bianco", + "editor-theme3/@update": "L'impostazione \"Commenti scuri\" è stato spostata da \"Modalità scura dell'editor e colori personalizzabili\" a qui ed è ora personalizzabile.", + "custom-block-text/@description": "Modifica lo spessore del testo dei blocchi e opzionalmente aggiunge un'ombreggiatura al testo.", + "custom-block-text/@name": "Stile del testo dei blocchi personalizzato", + "custom-block-text/@settings-name-bold": "Testo grassetto", + "custom-block-text/@settings-name-shadow": "Ombreggiatura sotto al testo", + "editor-colored-context-menus/@description": "Rende colorato il menu contestuale degli script.", + "editor-colored-context-menus/@name": "Menu contestuali colorati", + "editor-stage-left/@description": "Sposta lo stage nella parte sinistra dell'editor, come in Scratch 2.0.", + "editor-stage-left/@info-reverseOrder": "Per cambiare la posizione dei pulsanti sopra lo Stage usa l'addon \"inverti ordine dei controlli del progetto\".", + "editor-stage-left/@name": "Sposta stage a sinistra", + "editor-buttons-reverse-order/@description": "Sposta la bandiera verde e il pulsante di stop a destra e il pulsante modalità presentazione a sinistra, come in Scratch 2.0.", + "editor-buttons-reverse-order/@name": "Inverti l'ordine dei controlli del progetto", + "variable-manager/@description": "Aggiunge una scheda nell'editor a fianco a \"suoni\" per gestire facilmente variabili e liste.", + "variable-manager/@name": "Gestore variabili", + "variable-manager/@update": "Gli elementi delle liste possono ora essere aggiunti senza premere il tasto Shift. ", + "search-sprites/@description": "Aggiunge una casella di ricerca all'area degli sprite per cercare uno sprite basandosi sul nome.", + "search-sprites/@name": "Cerca gli sprite per nome", + "sprite-properties/@description": "Nasconde l'area delle informazioni per impostazione predefinita, come in Scratch 2.0. Usa il pulsante informazioni dello sprite selezionato o fai doppio-click su uno sprite per mostrare di l'area delle informazioni. Per nasconderla nuovamente usa il pulsante nascondi nell'area delle informazioni o fai di nuovo doppio-click su uno sprite.", + "sprite-properties/@name": "Informazioni degli sprite collassabili", + "sprite-properties/@settings-name-autoCollapse": "Nascondi automaticamente quando il mouse lascia l'area informazioni", + "sprite-properties/@settings-name-hideByDefault": "Nascondi l'area per impostazione predefinita", + "sprite-properties/@settings-name-transitionDuration": "Velocità animazione", + "sprite-properties/@settings-select-transitionDuration-default": "Predefinita", + "sprite-properties/@settings-select-transitionDuration-long": "Lenta", + "sprite-properties/@settings-select-transitionDuration-none": "Istantanea", + "sprite-properties/@settings-select-transitionDuration-short": "Veloce", + "gamepad/@description": "Interagisci con i progetti usando un controller/gamepad USB o bluetooth.", + "gamepad/@name": "Supporto Gamepad", + "gamepad/@settings-name-hide": "Nascondi pulsante impostazioni quando non è rilevato nessun controller", + "editor-sounds/@description": "Riproduce effetti sonori quando attacchi o cancelli i blocchi.", + "editor-sounds/@name": "Effetti sonori dell'editor", + "folders/@description": "Permette di organizzare in cartelle le liste degli sprite, dei costumi e dei suoni. Per creare una cartella clicca con il tasto destro su qualunque sprite, costume o suono e seleziona \"crea cartella\". Clicca una cartella per aprirla o chiuderla. Clicca con il tasto destro uno sprite, un costume o un suono per seleziona la cartella in cui spostarlo, oppure trascinalo in una cartella aperta. Questa funzione aggiunge \"[nomeCartella]//\" all'inizio del nome dei tuoi sprite. ", + "folders/@info-notice-folders-are-public": "Gli utenti che abilitano questo addon vedranno le cartelle nel loro progetto. Tutti gli altri vedranno le liste degli sprite, dei costumi e dei suoni normalmente (senza cartelle)", + "folders/@name": "Cartelle degli sprite", + "block-switching/@description": "Fai clic con il pulsante destro su un blocco per sostituirlo con un blocco correlato.", + "block-switching/@name": "Sostituzione blocchi", + "block-switching/@settings-name-control": "Blocchi Controllo", + "block-switching/@settings-name-customargs": "Argomenti dei blocchi personalizzati", + "block-switching/@settings-name-customargsmode": "Mostra le opzioni degli argomenti dei blocchi personalizzati", + "block-switching/@settings-name-data": "Blocchi Variabili", + "block-switching/@settings-name-event": "Blocchi Situazioni", + "block-switching/@settings-name-extension": "Blocchi Estensioni", + "block-switching/@settings-name-looks": "Blocchi Aspetto", + "block-switching/@settings-name-motion": "Blocchi Movimento", + "block-switching/@settings-name-noop": "Visualizza l'opzione per scambiare un blocco con se stesso", + "block-switching/@settings-name-operator": "Blocchi Operatori", + "block-switching/@settings-name-sensing": "Blocchi Sensori", + "block-switching/@settings-name-sound": "Blocchi Suono", + "block-switching/@settings-select-customargsmode-all": "Argomenti di tutti i blocchi personalizzati dello sprite", + "block-switching/@settings-select-customargsmode-defOnly": "Argomenti nei propri blocchi personalizzati", + "load-extensions/@description": "Fa comparire automaticamente nelle categorie dei blocchi dell'editor le estensioni musica e penna e altre estensioni.", + "load-extensions/@name": "Aggiungi automaticamente le estensioni", + "load-extensions/@settings-name-music": "Musica", + "load-extensions/@settings-name-pen": "Penna", + "load-extensions/@settings-name-text2speech": "Da Testo a Voce", + "load-extensions/@settings-name-translate": "Traduci", + "custom-zoom/@description": "Personalizza il minimo e il massimo zoom, la velocità e la dimensione di avvio dello zoom nell'area degli script e nasconde i controlli automaticamente.", + "custom-zoom/@name": "Zoom personalizzato dell'area degli script", + "custom-zoom/@settings-name-autohide": "Nascondi Controlli Zoom Automaticamente", + "custom-zoom/@settings-name-maxZoom": "Zoom Max (100-500%)", + "custom-zoom/@settings-name-minZoom": "Zoom Minimo (1-100%)", + "custom-zoom/@settings-name-speed": "Velocità Animazione di Entrata/Uscita Controlli", + "custom-zoom/@settings-name-startZoom": "Zoom Iniziale (50-500%)", + "custom-zoom/@settings-name-zoomSpeed": "Velocità Zoom (50-200%)", + "custom-zoom/@settings-select-speed-default": "Predefinita", + "custom-zoom/@settings-select-speed-long": "Lenta", + "custom-zoom/@settings-select-speed-none": "Istantanea", + "custom-zoom/@settings-select-speed-short": "Veloce", + "initialise-sprite-position/@description": "Cambia la posizione x/y predefinita dei nuovi sprite. ", + "initialise-sprite-position/@name": "Posizione iniziale dei nuovi sprite personalizzata", + "initialise-sprite-position/@settings-name-duplicate": "Comportamento quando si duplicano gli sprite", + "initialise-sprite-position/@settings-name-library": "Rendi casuale la posizione degli sprite della libreria", + "initialise-sprite-position/@settings-name-x": "Posizione X", + "initialise-sprite-position/@settings-name-y": "Posizione Y", + "initialise-sprite-position/@settings-select-duplicate-custom": "Compaiono a coordinate x/y specifiche", + "initialise-sprite-position/@settings-select-duplicate-keep": "Compaiono nella stessa posizione dello sprite originale", + "initialise-sprite-position/@settings-select-duplicate-randomize": "Compaiono in un punto a caso", + "blocks2image/@description": "Clicca con il tasto destro l'area degli script per esportare i blocchi come immagini SVG/PNG.", + "blocks2image/@name": "Salva i blocchi come immagine", + "remove-curved-stage-border/@description": "Rimuove i bordi curvi intorno allo stage, permettendoti di vedere gli angoli.", + "remove-curved-stage-border/@name": "Rimuove i bordi curvi dello stage", + "transparent-orphans/@description": "Decidi tu la trasparenza dei blocchi nell'editor, con opzioni separate per i blocchi \"orfani\" (blocchi che non sono attaccati ad un cappello) e i blocchi trascinati.", + "transparent-orphans/@name": "Trasparenza dei blocchi", + "transparent-orphans/@settings-name-block": "Trasparenza dei blocchi (%)", + "transparent-orphans/@settings-name-dragged": "Trasparenza dei blocchi trascinati (%)", + "transparent-orphans/@settings-name-orphan": "Trasparenza dei blocchi orfani (%)", + "paint-by-default/@description": "Cambia l'azione predefinita dei pulsanti \"Scegli uno Sprite/Costume/Sfondo/Suono\" che come azione predefinita apre la libreria.", + "paint-by-default/@name": "Disegno costume come azione predefinita", + "paint-by-default/@settings-name-backdrop": "Scegli uno sfondo", + "paint-by-default/@settings-name-costume": "Scegli un costume", + "paint-by-default/@settings-name-sound": "Scegli un suono", + "paint-by-default/@settings-name-sprite": "Scegli uno Sprite", + "paint-by-default/@settings-select-backdrop-library": "Scegli uno sfondo dalla Libreria", + "paint-by-default/@settings-select-backdrop-paint": "Disegna un nuovo sfondo", + "paint-by-default/@settings-select-backdrop-surprise": "Disegna uno sfondo a sorpresa", + "paint-by-default/@settings-select-backdrop-upload": "Importa sfondo", + "paint-by-default/@settings-select-costume-library": "Scegli un costume dalla Libreria", + "paint-by-default/@settings-select-costume-paint": "Disegna un nuovo costume", + "paint-by-default/@settings-select-costume-surprise": "Disegna un costume a sorpresa", + "paint-by-default/@settings-select-costume-upload": "Importa costume", + "paint-by-default/@settings-select-sound-library": "Scegli un suono dalla Libreria", + "paint-by-default/@settings-select-sound-record": "Registra", + "paint-by-default/@settings-select-sound-surprise": "Scegli un suono a sorpresa", + "paint-by-default/@settings-select-sound-upload": "Importa suono", + "paint-by-default/@settings-select-sprite-library": "Scegli uno sprite dalla Libreria", + "paint-by-default/@settings-select-sprite-paint": "Disegna un nuovo sprite", + "paint-by-default/@settings-select-sprite-surprise": "Aggiunti uno sprite a sorpresa", + "paint-by-default/@settings-select-sprite-upload": "Importa sprite", + "block-cherry-picking/@description": "Aggiunge la possibilità di trascinare un singolo blocco dall'interno di uno script (invece di tutta la sequenza attacca al di sotto) se si preme contemporaneamente il tasto CTRL.", + "block-cherry-picking/@info-flipControls": "Se \"inverti i controlli\" è abilitato, il comportamento standard sarà trascinare singoli i blocchi. Tenendo premuto CTRL verrà invece trascinata tutta la sequenza", + "block-cherry-picking/@info-macContextDisabled": "In macOS usa il tasto Cmd invece del tasto Ctrl.", + "block-cherry-picking/@name": "Afferra i singoli blocchi con il tasto CTRL", + "block-cherry-picking/@settings-name-invertDrag": "Inverti i controlli", + "hide-new-variables/@description": "Non crea automaticamente il monitor sullo Stage per le variabili e le liste appena create.", + "hide-new-variables/@name": "Nascondi nuove variabili", + "editor-extra-keys/@description": "Aggiunge ulteriori tasti ai menu dei blocchi \"tasto () premuto\" e \"quando si preme il tasto ()\", ad esempio invio, punto, virgola e altri ancora. Questi tasti funzioneranno anche per gli utenti che non hanno installato l'addon.", + "editor-extra-keys/@info-experimentalKeysWarn": "I \"tasti sperimentali\" includono i segni uguale, slash, punto e virgola e altri. Potrebbero non funzionare per tutti i sistemi operativi e per tutte le configurazioni della tastiera.", + "editor-extra-keys/@info-shiftKeysWarn": "I \"Tasti shift\" includono tasti che solitamente richiedono la pressione del tasto shift e di un tasto numerico, ad esempio il punto esclamativo, il dollaro, e altri. Questi tasti funzionando soltanto con il blocco \"quando si preme il tasto ()\" e non funzionano per tutti i sistemi operativi e tutte le configurazioni della tastiera.", + "editor-extra-keys/@name": "Supporto per tasti extra", + "editor-extra-keys/@settings-name-experimentalKeys": "Mostra tasti sperimentali", + "editor-extra-keys/@settings-name-shiftKeys": "Mostra tasti Shift", + "hide-delete-button/@description": "Nasconde il pulsante cancella (icona del cestino) dagli sprite, costumi e suoni. E' possibile cancellarli usando il menu contestuale.", + "hide-delete-button/@name": "Nasconde il pulsante cancella", + "hide-delete-button/@settings-name-costumes": "Costumi e sfondi", + "hide-delete-button/@settings-name-sounds": "Suoni", + "hide-delete-button/@settings-name-sprites": "Sprite", + "no-script-bumping/@description": "Permette agli script di essere spostati e modificati senza che gli script che si sovrappongono vengano spostati.", + "no-script-bumping/@name": "Non spaziare automaticamente gli script che si sovrappongono", + "disable-stage-drag-select/@description": "Impedisce di trascinare gli sprite visibili sullo stage, tranne quelli esplicitamente indicati come trascinabili. Tieni premuto Shift mentre li trascini per spostarli normalmente.", + "disable-stage-drag-select/@name": "Sprite non trascinabili nell'editor", + "move-to-top-bottom/@description": "Aggiunge opzione al menu contestuale per spostare i costumi e i suoni in cima o in fondo alla lista.", + "move-to-top-bottom/@info-developer-tools": " Questo addon faceva parte in precedenza dell'addon \"strumenti per sviluppatori\" ma è stato spostato qui.", + "move-to-top-bottom/@name": "Sposta costumi in cima o in fondo", + "disable-paste-offset/@description": "Nell'editor dei costumi incolla gli elementi copiati nella loro posizione originale invece di spostarli leggermente.", + "disable-paste-offset/@info-vanilla": "Questo comportamento può essere ottenuto anche usando Alt+Click sugli oggettim, senza abilitare questo addon.", + "disable-paste-offset/@name": "Non spostare gli elementi copiati", + "block-duplicate/@description": "Duplica rapidamente uno script trascinandolo mentre tieni premuto il tasto Alt. Tenendo premuto anche Ctrl duplicherai solo il blocco cliccato dal mouse invece di tutta la sequenza attaccata al di sotto. ", + "block-duplicate/@info-mac": "In macOS usa il tasto Opzione invece del tasto Alt key e il tasto Command invece del tasto Control.", + "block-duplicate/@name": "Duplica uno script con il tasto Alt", + "swap-local-global/@description": "Aggiunge più opzioni quando si rinomina una variabile o una lista esistente: permette di cambiare da \"Per tutti gli sprite\" e \"Solo per questo sprite\" e tra variabile locale e variabile cloud. Aggiunge un'ulteriore opzione quando si clicca una variabile/lista con il pulsante destro per cambiarne rapidamente la visibilità.", + "swap-local-global/@name": "Cambia le variabili da \"Per tutti gli sprite\" a \"Solo per questo sprite\"", + "editor-comment-previews/@description": "Ti permette di vedere l'anteprima del contenuto dei commenti passando il mouse sui commenti chiusi o sui blocchi. Puoi usarlo per vedere i commenti che sono al di fuori dell'area visibile dell'editor, identificare un blocco di tipo ciclo dal basso attraverso la sua anteprima, far entrare i commenti lunghi in uno spazio piccolo e molto altro. ", + "editor-comment-previews/@name": "Anteprime dei commenti dell'editor", + "editor-comment-previews/@settings-name-delay": "Durata della pausa", + "editor-comment-previews/@settings-name-follow-mouse": "Segui il mouse", + "editor-comment-previews/@settings-name-hover-view": "Passa il mouse sui commenti chiusi per vedere l'anteprima", + "editor-comment-previews/@settings-name-hover-view-block": "Passa il mouse sui blocchi per vedere l'anteprima dei commenti attaccati", + "editor-comment-previews/@settings-name-hover-view-procedure": "Passa il mouse sui blocchi personalizzati per vedere l'anteprima dei commenti della definizione", + "editor-comment-previews/@settings-name-reduce-animation": "Riduci le animazioni", + "editor-comment-previews/@settings-name-reduce-transparency": "Riduci la trasparenza", + "editor-comment-previews/@settings-select-delay-long": "Lunga", + "editor-comment-previews/@settings-select-delay-none": "Nessuna", + "editor-comment-previews/@settings-select-delay-short": "Breve", + "columns/@description": "Divide il menu delle categorie dei blocchi in due colonne e lo sposta in cima alla lista dei blocchi, come in Scratch 2.0.", + "columns/@name": "Menu delle categorie a due colonne", + "number-pad/@description": "Mostra il tastierino numerico di Scratch su tutti i dispositivi quando si modificano gli argomenti numerici, non soltanto sui dispositivi touch.", + "number-pad/@info-explanation": "Comparirà un tastierino numerico quando si modificano gli argomenti numerici di un blocco, ad esempio il blocco \"vai dove x è\".", + "number-pad/@name": "Mostra sempre tastierino numerico", + "script-snap/@description": "Trascina uno script per allinearlo automaticamente ai puntini presenti nell'area del codice.", + "script-snap/@name": "Aggancia gli script alla griglia", + "script-snap/@preset-name-default": "Predefinito", + "script-snap/@preset-name-half-block": "Dimensione di mezzo blocco", + "script-snap/@preset-name-whole-block": "Dimensione di un blocco intero", + "script-snap/@settings-name-grid": "Dimensione della griglia (px)", + "fullscreen/@description": "Corregge alcuni effetti indesiderati della modalità fullscreen, apre il progetto nella modalità fullscreen del tuo browser e nasconde la barra che contiene la bandiera verde.", + "fullscreen/@info-hideToolbarNotice": "Se decidi di nascondere la barra ricorda che puoi usare il tasto Esc per uscire dalla modalità fullscreen.", + "fullscreen/@name": "Schermo intero migliorato", + "fullscreen/@settings-name-browserFullscreen": "Apre il fullscreen del player nella modalità fullscreen del browser.", + "fullscreen/@settings-name-hideToolbar": "Nascondi la barra in modalità fullscreen", + "hide-stage/@description": "Aggiunge un pulsante vicino ai pulsanti \"stage piccolo\" e \"stage grande\" per nascondere lo stage e l'area degli sprite, rendendo l'area degli script molto più ampia.", + "hide-stage/@name": "Nasconde lo stage e l'area degli sprite", + "editor-stepping/@description": "Aggiunge un bordo colorato ai blocchi in esecuzione nel progetto.", + "editor-stepping/@name": "Bordo blocchi in esecuzione", + "editor-stepping/@settings-name-highlight-color": "Colore evidenziazione" +} \ No newline at end of file diff --git a/src/addons/addons-l10n-settings/ja.json b/src/addons/addons-l10n-settings/ja.json new file mode 100644 index 0000000000000000000000000000000000000000..f0f23422704f1ac1867c0cda2685ef378ddc14eb --- /dev/null +++ b/src/addons/addons-l10n-settings/ja.json @@ -0,0 +1,389 @@ +{ + "cat-blocks/@description": "2020年のエイプリルフールの「キャットブロック」を追加する。", + "cat-blocks/@info-watch": "「カーソルを向く」設定を使用すると、エディターが重くなるかもしれません。", + "cat-blocks/@name": "キャットブロック", + "cat-blocks/@settings-name-watch": "カーソルを向く", + "editor-devtools/@description": "メニューオプション、ブロックのコピペ、「きれいにする」などを追加する。", + "editor-devtools/@name": "開発者ツール", + "editor-devtools/@settings-name-enableCleanUpPlus": "きれいにする +", + "editor-devtools/@settings-name-enablePasteBlocksAtMouse": "カーソルの位置にブロックを配置", + "find-bar/@description": "スクリプト、コスチューム、音を検索する検索バーを音タブの横に追加する。Ctrl+左右キーで検索履歴から移動する。", + "find-bar/@info-developer-tools": "このアドオンは以前「開発者ツール」の一部でしたが、移動しました。", + "find-bar/@name": "エディター検索バー", + "middle-click-popup/@description": "コードエリアにてマウスの中ボタンを押すか、Ctrl+スペースまたはShift+クリックで表示される入力欄にブロックの名前を入力してドラッグすると、ブロックを追加できる。Shiftキーを押しながらドラッグすると、画面を閉じずに複数のブロックを追加できる。", + "middle-click-popup/@info-developer-tools": "このアドオンは以前「開発者ツール」の一部でしたが、移動しました。", + "middle-click-popup/@name": "名前からブロックを追加", + "jump-to-def/@description": "中マウスボタンやShift+Clickで、カスタムブロックの定義ブロックに移動できるようにする。", + "jump-to-def/@info-developer-tools": "このアドオンは以前「開発者ツール」の一部でしたが、移動しました。", + "jump-to-def/@name": "カスタムブロック定義に移動", + "editor-searchable-dropdowns/@description": "ブロックのドロップダウンの選択肢を検索する。", + "editor-searchable-dropdowns/@name": "ドロップダウン検索", + "data-category-tweaks-v2/@description": "変数ブロックの表示を改良する。", + "data-category-tweaks-v2/@name": "変数ブロック改良", + "data-category-tweaks-v2/@settings-name-moveReportersDown": "変数ブロックを変数リストの上に移動", + "data-category-tweaks-v2/@settings-name-separateListCategory": "リストを分離", + "data-category-tweaks-v2/@settings-name-separateLocalVariables": "スプライトのみの変数を分離", + "block-palette-icons/@description": "ブロックパレットのカテゴリーにアイコンを追加する。", + "block-palette-icons/@name": "ブロックパレットアイコン", + "hide-flyout/@description": "ブロックパレットをホバーしていないときに隠す。ロックアイコンをクリックして表示し続けたり、「カテゴリー・クリック」を使うこともできる。", + "hide-flyout/@info-hoverExplanation": "「パレット部分のホバー」は、閲覧部分のみ拡大します。誤ってブロックを削除しないようにするには、他のモードを使ってください。", + "hide-flyout/@name": "ブロックパレット隠し", + "hide-flyout/@settings-name-speed": "アニメーションの速さ", + "hide-flyout/@settings-name-toggle": "固定方法", + "hide-flyout/@settings-select-speed-default": "既定", + "hide-flyout/@settings-select-speed-long": "遅く", + "hide-flyout/@settings-select-speed-none": "即時", + "hide-flyout/@settings-select-speed-short": "速く", + "hide-flyout/@settings-select-toggle-category": "カテゴリー・クリック", + "hide-flyout/@settings-select-toggle-cathover": "カテゴリーのホバー", + "hide-flyout/@settings-select-toggle-hover": "パレット部分のホバー", + "hide-flyout/@update": "アドオンが見直され、多くのバグが修正されました。", + "mediarecorder/@description": "ステージを録画するボタンをエディターのメニューバーに追加する。", + "mediarecorder/@name": "ステージを録画", + "drag-drop/@description": "エディターのスプライトペインやコスチュームペインにファイルをドロップしたり、リストや「聞いて待つ」画面にテキストファイルをドロップできるようにする。", + "drag-drop/@name": "ファイルをドロップ", + "drag-drop/@settings-name-use-hd-upload": "HDアップロードを使用", + "debugger/@name": "デバッガー", + "debugger/@settings-name-log_broadcasts": "メッセージを記録", + "debugger/@settings-name-log_clear_greenflag": "緑の旗が押されたときにログを消去", + "debugger/@settings-name-log_clone_create": "クローンの作成を記録", + "debugger/@settings-name-log_failed_clone_creation": "クローン作成失敗時に記録", + "debugger/@settings-name-log_greenflag": "緑の旗を記録", + "debugger/@update": "デバッガー画面に「スレッド」と「パフォーマンス」タブが追加されました。", + "pause/@description": "緑の旗の横に一時停止ボタンを追加する。", + "pause/@name": "一時停止ボタン", + "mute-project/@description": "緑の旗をCtr+クリックでミュートする。", + "mute-project/@info-macOS": "macOSでは、Ctrlの代わりにCommandキーを押してください。", + "mute-project/@name": "プロジェクトをミュート", + "vol-slider/@description": "緑の旗の横に音量スライダーを追加する。", + "vol-slider/@name": "プロジェクト音量スライダー", + "vol-slider/@settings-name-defVol": "デフォルトの音量", + "clones/@description": "クローンの合計数をステージの上に表示する。", + "clones/@name": "クローンカウンター", + "clones/@settings-name-showicononly": "アイコンのみ表示", + "mouse-pos/@description": "ステージの上にマウスの座標を表示する。", + "mouse-pos/@name": "マウスの座標", + "color-picker/@description": "16進数カラーコードの入力欄を追加する。", + "color-picker/@name": "16進数カラーピッカー", + "remove-sprite-confirm/@description": "スプライトの削除時に確認画面を表示する。", + "remove-sprite-confirm/@name": "スプライト削除確認画面", + "block-count/@description": "エディターのメニューバーに合計ブロック数を表示する。", + "block-count/@name": "ブロックカウント", + "onion-skinning/@description": "コスチューム編集時に前後のコスチュームが表示される半透明なレイヤーを追加する。拡大ボタンの横のボタンで制御可能。", + "onion-skinning/@name": "半透明コスチュームエディター", + "onion-skinning/@settings-name-afterTint": "次のコスチュームに色", + "onion-skinning/@settings-name-beforeTint": "前のコスチュームに色", + "onion-skinning/@settings-name-default": "既定で有効化", + "onion-skinning/@settings-name-layering": "既定のレイヤー", + "onion-skinning/@settings-name-mode": "既定のモード", + "onion-skinning/@settings-name-next": "次のコスチューム", + "onion-skinning/@settings-name-opacity": "透明度 (%)", + "onion-skinning/@settings-name-opacityStep": "透明度の変化の割合 (%)", + "onion-skinning/@settings-name-previous": "前のコスチューム", + "onion-skinning/@settings-select-layering-behind": "後ろ", + "onion-skinning/@settings-select-layering-front": "前", + "onion-skinning/@settings-select-mode-merge": "画像をマージ", + "onion-skinning/@settings-select-mode-tint": "色合い", + "paint-snap/@description": "コスチュームエディターにて、オブジェクトを枠線やベクターのノードにスナップさせる。", + "paint-snap/@name": "グリッドにスナップ", + "paint-snap/@settings-name-boxCenter": "選択したオブジェクトの中央からスナップ", + "paint-snap/@settings-name-boxCorners": "選択したオブジェクトの角からスナップ", + "paint-snap/@settings-name-boxEdgeMids": "選択したオブジェクトの中点からスナップ", + "paint-snap/@settings-name-enable-default": "既定で有効化", + "paint-snap/@settings-name-guide-color": "ガイド色", + "paint-snap/@settings-name-objectCenters": "オブジェクトの中央にスナップ", + "paint-snap/@settings-name-objectCorners": "オブジェクトの角にスナップ", + "paint-snap/@settings-name-objectEdges": "オブジェクトの端にスナップ", + "paint-snap/@settings-name-objectMidlines": "オブジェクトの中央線にスナップ", + "paint-snap/@settings-name-pageAxes": "ページの座標軸にスナップ", + "paint-snap/@settings-name-pageCenter": "ページの中央にスナップ", + "paint-snap/@settings-name-pageCorners": "ページの角にスナップ", + "paint-snap/@settings-name-pageEdges": "ページの端にスナップ", + "paint-snap/@settings-name-threshold": "スナップ距離", + "default-costume-editor-color/@description": "コスチュームエディターの既定の色と輪郭の大きさを変更する。", + "default-costume-editor-color/@name": "コスチュームエディターの既定の色を変更", + "default-costume-editor-color/@settings-name-fill": "既定の塗りつぶし色", + "default-costume-editor-color/@settings-name-persistence": "ツール変更時に色をリセットせず、以前の色を使用する", + "default-costume-editor-color/@settings-name-stroke": "既定の輪郭色", + "default-costume-editor-color/@settings-name-strokeSize": "既定の輪郭の大きさ", + "bitmap-copy/@description": "ペイントエディターでビットマップ画像をコピー可能にする。", + "bitmap-copy/@info-norightclick": "右クリックメニューは使えません。ビットマップ画像を選択し、Ctrl+Cを押してください。", + "bitmap-copy/@name": "ビットマップ画像をコピー", + "2d-color-picker/@description": "コスチュームエディターの鮮やかさと明るさのスライダーを2Dカラーピッカーにする。Shiftキーを押して一方のみを変更する。", + "2d-color-picker/@name": "2D カラーピッカー", + "better-img-uploads/@description": "「コスチュームをアップロード」ボタンの上に、画像を自動的にSVGに変換して画質を保つ「HDアップロード」ボタンを追加する。", + "better-img-uploads/@info-notSuitableEdit": "このアドオンを使ってアップロードした画像は、編集には適しません。", + "better-img-uploads/@name": "画像のHD アップロード", + "better-img-uploads/@settings-name-fitting": "画像のサイズ", + "better-img-uploads/@settings-select-fitting-fill": "伸ばす", + "better-img-uploads/@settings-select-fitting-fit": "縮める", + "better-img-uploads/@settings-select-fitting-full": "元サイズ", + "pick-colors-from-stage/@description": "コスチュームエディターのカラーピッカーでステージから色を選べるようにする。", + "pick-colors-from-stage/@name": "コスチュームエディターでステージの色を選択", + "custom-block-shape/@description": "ブロックのパディング、角、切れ込みを調節する。", + "custom-block-shape/@info-paddingWarning": "パディングのサイズは他のユーザーには適用されません。", + "custom-block-shape/@name": "ブロックの形をカスタマイズ", + "custom-block-shape/@preset-description-default2": "Scratch 2.0風のブロック", + "custom-block-shape/@preset-description-default3": "Scratch 3.0ブロックの既定値", + "custom-block-shape/@preset-description-flat2": "切れ込みと角をなくしたScratch 2.0ブロック", + "custom-block-shape/@preset-description-flat3": "切れ込みと角をなくしたScratch 3.0ブロック", + "custom-block-shape/@preset-name-default2": "2.0ブロック", + "custom-block-shape/@preset-name-default3": "3.0ブロック", + "custom-block-shape/@preset-name-flat2": "2.0 フラット", + "custom-block-shape/@preset-name-flat3": "3.0 フラット", + "custom-block-shape/@settings-name-cornerSize": "角のサイズ (0-300%)", + "custom-block-shape/@settings-name-notchSize": "切れ込みの高さ (0-150%)", + "custom-block-shape/@settings-name-paddingSize": "パディングのサイズ (50-200%)", + "zebra-striping/@description": "重なっている同じカテゴリーのブロックの色の彩度を交互に変える。「ゼブラストライピング」とも呼ばれている。", + "zebra-striping/@name": "ブロックの色を交互に変更", + "zebra-striping/@settings-name-intensity": "倍率 (0-100%)", + "zebra-striping/@settings-name-shade": "明るさ", + "zebra-striping/@settings-select-shade-darker": "暗く", + "zebra-striping/@settings-select-shade-lighter": "明るく", + "editor-theme3/@description": "ブロックの色をカテゴリーごとに変更する。", + "editor-theme3/@name": "ブロックの色をカスタマイズ", + "editor-theme3/@preset-description-black": "ブロックの背景色を黒にする", + "editor-theme3/@preset-description-dark": "既定の色を暗くしたバージョン", + "editor-theme3/@preset-description-original": "Scratch 2.0の色", + "editor-theme3/@preset-description-tweaks": "Scratch 2.0風のイベント、制御、定義ブロック", + "editor-theme3/@preset-name-black": "黒", + "editor-theme3/@preset-name-dark": "ダーク", + "editor-theme3/@preset-name-original": "2.0の色", + "editor-theme3/@settings-name-Pen-color": "拡張機能", + "editor-theme3/@settings-name-comment-color": "コメント", + "editor-theme3/@settings-name-control-color": "制御", + "editor-theme3/@settings-name-custom-color": "定義", + "editor-theme3/@settings-name-data-color": "変数", + "editor-theme3/@settings-name-data-lists-color": "リスト", + "editor-theme3/@settings-name-events-color": "イベント", + "editor-theme3/@settings-name-input-color": "ブロックの入力", + "editor-theme3/@settings-name-looks-color": "見た目", + "editor-theme3/@settings-name-motion-color": "動き", + "editor-theme3/@settings-name-operators-color": "演算", + "editor-theme3/@settings-name-sensing-color": "調べる", + "editor-theme3/@settings-name-sounds-color": "音", + "editor-theme3/@settings-name-text": "文字色", + "editor-theme3/@settings-select-text-black": "黒", + "editor-theme3/@settings-select-text-colorOnBlack": "黒背景に色", + "editor-theme3/@settings-select-text-colorOnWhite": "白背景に色", + "editor-theme3/@settings-select-text-white": "白", + "editor-theme3/@update": "「エディターのダークモードとカスタマイズ」アドオンの「コメントにダークモードを適用」設定がここに移動され、色を変更できるようになりました。", + "custom-block-text/@description": "ブロック内のテキストの太さを変更したり、影を追加したりする。", + "custom-block-text/@name": "ブロック内のテキスト装飾変更", + "custom-block-text/@settings-name-bold": "太字", + "custom-block-text/@settings-name-shadow": "影", + "editor-colored-context-menus/@description": "コンテキストメニューに色を付ける。", + "editor-colored-context-menus/@name": "右クリックメニューを色付け", + "editor-stage-left/@description": "Scratch 2.0のように、ステージを左側に表示する。", + "editor-stage-left/@info-reverseOrder": "ステージ上のボタンの位置を変更するには、「プロジェクト操作ボタン反転」アドオンを使用してください。", + "editor-stage-left/@name": "ステージを左側に表示", + "editor-buttons-reverse-order/@description": "Scratch 2.0のように、緑の旗と停止ボタンを右に、全画面表示ボタンを左に移動させる。", + "editor-buttons-reverse-order/@name": "プロジェクト操作ボタン反転", + "variable-manager/@description": "エディターに変数とリストを管理するためのタブを追加する。", + "variable-manager/@name": "変数マネージャー", + "variable-manager/@update": "リスト項目がShiftキーを押さずに追加できるようになりました。", + "search-sprites/@description": "スプライトペインに、スプライトを名前で検索する項目を追加する。", + "search-sprites/@name": "スプライトを検索", + "sprite-properties/@description": "Scratch 2.0のように、スプライトプロパティ―パネルを既定で隠す。選択されたスプライトの情報ボタンをクリックするか、スプライトをダブルクリックしてプロパティ―パネルを表示する。プロパティ―パネルの閉じるボタンをクリックするか、スプライトをダブルクリックしてプロパティ―パネルを閉じる。", + "sprite-properties/@name": "スプライトプロパティーを隠す", + "sprite-properties/@settings-name-autoCollapse": "スプライトパネル外にマウスが移動したときに自動的に隠す", + "sprite-properties/@settings-name-hideByDefault": "プロパティ―パネルを既定で隠す", + "sprite-properties/@settings-name-transitionDuration": "アニメーションの速さ", + "sprite-properties/@settings-select-transitionDuration-default": "既定", + "sprite-properties/@settings-select-transitionDuration-long": "遅く", + "sprite-properties/@settings-select-transitionDuration-none": "即時", + "sprite-properties/@settings-select-transitionDuration-short": "速く", + "gamepad/@description": "USBかBluetoothのコントローラーやゲームパッドを利用する。", + "gamepad/@name": "ゲームパッド", + "gamepad/@settings-name-hide": "コントローラーが検出されない場合に設定ボタンを隠す", + "editor-sounds/@description": "ブロックをつなげたり削除したりするときに効果音を鳴らす。", + "editor-sounds/@name": "エディター効果音", + "folders/@description": "スプライト・コスチューム・音のリストにフォルダーを追加する。フォルダーを作成するには、スプライトを右クリックし「フォルダーを作成」を押す。クリックして開閉し、スプライトをドラッグか右クリックしてフォルダーに移動させる。これは、「[フォルダー名]//」をスプライト名の先頭に追加することによって動作する。", + "folders/@info-notice-folders-are-public": "この機能を有効化していない場合は、スプライトはすべて表示されますが、フォルダーは表示されません。", + "folders/@name": "スプライトフォルダー", + "block-switching/@description": "ブロックを右クリックして類似のブロックに変える。", + "block-switching/@name": "ブロック置換", + "block-switching/@settings-name-control": "制御ブロック", + "block-switching/@settings-name-customargs": "定義ブロックの引数", + "block-switching/@settings-name-customargsmode": "表示する定義ブロック引数", + "block-switching/@settings-name-data": "変数ブロック", + "block-switching/@settings-name-event": "イベントブロック", + "block-switching/@settings-name-extension": "拡張機能ブロック", + "block-switching/@settings-name-looks": "見た目ブロック", + "block-switching/@settings-name-motion": "動きブロック", + "block-switching/@settings-name-noop": "現在のブロックを表示", + "block-switching/@settings-name-operator": "演算ブロック", + "block-switching/@settings-name-sensing": "調べるブロック", + "block-switching/@settings-name-sound": "音ブロック", + "block-switching/@settings-select-customargsmode-all": "スプライト内のすべての定義ブロックの引数", + "block-switching/@settings-select-customargsmode-defOnly": "同じ定義ブロック内の引数", + "load-extensions/@description": "プロジェクトに自動で拡張機能を追加する。", + "load-extensions/@name": "拡張機能の自動追加", + "load-extensions/@settings-name-music": "音楽", + "load-extensions/@settings-name-pen": "ペン", + "load-extensions/@settings-name-text2speech": "音声合成", + "load-extensions/@settings-name-translate": "翻訳", + "custom-zoom/@description": "コードペインのズーム設定をカスタマイズする。", + "custom-zoom/@name": "カスタムズーム設定", + "custom-zoom/@settings-name-autohide": "ズームボタンを隠す", + "custom-zoom/@settings-name-maxZoom": "最大値 (100-500%)", + "custom-zoom/@settings-name-minZoom": "最小値 (1-100%)", + "custom-zoom/@settings-name-speed": "アニメーションの速さ", + "custom-zoom/@settings-name-startZoom": "初期値 (50-500%)", + "custom-zoom/@settings-name-zoomSpeed": "ズームの割合 (50-200%)", + "custom-zoom/@settings-select-speed-default": "既定", + "custom-zoom/@settings-select-speed-long": "遅く", + "custom-zoom/@settings-select-speed-none": "即時", + "custom-zoom/@settings-select-speed-short": "速く", + "initialise-sprite-position/@description": "新しいスプライトのデフォルトのX・Y座標を変更する。", + "initialise-sprite-position/@name": "新しいスプライトの位置を変更", + "initialise-sprite-position/@settings-name-duplicate": "スプライト複製時の動作", + "initialise-sprite-position/@settings-name-library": "ランダム", + "initialise-sprite-position/@settings-name-x": "X座標", + "initialise-sprite-position/@settings-name-y": "Y座標", + "initialise-sprite-position/@settings-select-duplicate-custom": "指定した座標に移動", + "initialise-sprite-position/@settings-select-duplicate-keep": "元スプライトと同じ座標にする", + "initialise-sprite-position/@settings-select-duplicate-randomize": "ランダムにする", + "blocks2image/@description": "コードエリアを右クリックしてブロックをSVG/PNGとして出力する。", + "blocks2image/@name": "ブロックを画像に出力", + "remove-curved-stage-border/@description": "ステージの枠の丸みをなくし、角を見れるようにする。", + "remove-curved-stage-border/@name": "ステージの枠の丸み除去", + "transparent-orphans/@description": "エディター内のつながっていないブロックやドラッグ中のブロックの透明度を調整する。", + "transparent-orphans/@name": "透明ブロック", + "transparent-orphans/@settings-name-block": "ブロックの透明度 (%)", + "transparent-orphans/@settings-name-dragged": "ドラッグ中のブロックの透明度 (%)", + "transparent-orphans/@settings-name-orphan": "つながっていないブロックの透明度 (%)", + "paint-by-default/@description": "「スプライト・コスチューム・背景・音を選ぶ」ボタンの既定の動作を変更する。", + "paint-by-default/@name": "空のコスチュームを追加ボタン", + "paint-by-default/@settings-name-backdrop": "背景", + "paint-by-default/@settings-name-costume": "コスチューム", + "paint-by-default/@settings-name-sound": "音", + "paint-by-default/@settings-name-sprite": "スプライト", + "paint-by-default/@settings-select-backdrop-library": "ライブラリー", + "paint-by-default/@settings-select-backdrop-paint": "空の背景", + "paint-by-default/@settings-select-backdrop-surprise": "サプライズ", + "paint-by-default/@settings-select-backdrop-upload": "アップロード", + "paint-by-default/@settings-select-costume-library": "ライブラリー", + "paint-by-default/@settings-select-costume-paint": "空のコスチューム", + "paint-by-default/@settings-select-costume-surprise": "サプライズ", + "paint-by-default/@settings-select-costume-upload": "アップロード", + "paint-by-default/@settings-select-sound-library": "ライブラリー", + "paint-by-default/@settings-select-sound-record": "録音", + "paint-by-default/@settings-select-sound-surprise": "サプライズ", + "paint-by-default/@settings-select-sound-upload": "アップロード", + "paint-by-default/@settings-select-sprite-library": "ライブラリー", + "paint-by-default/@settings-select-sprite-paint": "空のスプライト", + "paint-by-default/@settings-select-sprite-surprise": "サプライズ", + "paint-by-default/@settings-select-sprite-upload": "アップロード", + "block-cherry-picking/@description": "Ctrlキーを押している間、ブロックをつかむとそのブロックだけが移動するようにする。", + "block-cherry-picking/@info-flipControls": "「入力を反転」を利用している場合は、Ctrlキーを押さずにブロックをつかむとそのブロックだけが移動し、Ctrlキーを押すと下のブロックも一緒に移動するようになります。", + "block-cherry-picking/@info-macContextDisabled": "macOSでは、Ctrlの代わりにCommandキーを押してください。", + "block-cherry-picking/@name": "Ctrlキーでブロックをつかむ", + "block-cherry-picking/@settings-name-invertDrag": "入力を反転", + "hide-new-variables/@description": "新しく作成した変数やリストのモニターを自動で隠す。", + "hide-new-variables/@name": "変数を自動で隠す", + "editor-extra-keys/@description": "\"() キーが押された?\" ブロックのドロップダウンに、Enter、ドット、カンマなどのキーを追加する。これらは、アドオンを有効化しなくても動作する。", + "editor-extra-keys/@info-experimentalKeysWarn": "「実験的なキー」には、等号、スラッシュ、セミコロンなどが含まれます。OSやキーボードのレイアウトによっては、うまく動作しないことがあります。", + "editor-extra-keys/@info-shiftKeysWarn": "「Shiftキー」設定を有効化すると、Shiftキーと数字キーを押して入力する、ハッシュ、感嘆符などのキーが追加されます。これらのキーは「() キーが押されたとき」ブロックでのみ動作し、OSやキーボードのレイアウトによっては一切動作しないことがあります。", + "editor-extra-keys/@name": "キー入力オプションの追加", + "editor-extra-keys/@settings-name-experimentalKeys": "実験的なキー", + "editor-extra-keys/@settings-name-shiftKeys": "Shiftキー", + "hide-delete-button/@description": "削除ボタン(ゴミ箱アイコン)を、スプライト、コスチュームや音から隠す。コンテキストメニューを使えば、通常通り削除できる。", + "hide-delete-button/@name": "削除ボタンを隠す", + "hide-delete-button/@settings-name-costumes": "コスチュームと背景", + "hide-delete-button/@settings-name-sounds": "音", + "hide-delete-button/@settings-name-sprites": "スプライト", + "no-script-bumping/@description": "スクリプトを重ねて配置できるようにする。", + "no-script-bumping/@name": "スクリプト重ね配置", + "disable-stage-drag-select/@description": "ステージではShiftキーを押さないとスプライトをドラッグできないようにする。", + "disable-stage-drag-select/@name": "ドラッグできないスプライト", + "move-to-top-bottom/@description": "コスチュームや音を一覧の一番上や一番下に移動する右クリックメニュー項目を追加する。", + "move-to-top-bottom/@info-developer-tools": "このアドオンは以前「開発者ツール」の一部でしたが、移動しました。", + "move-to-top-bottom/@name": "コスチュームを一番上や一番下に移動", + "disable-paste-offset/@description": "コスチュームエディター上に張り付けるとき、元の場所からずらさずに張り付ける。", + "disable-paste-offset/@info-vanilla": "ブロックをAlt+クリックすると、アドオンなしでもこの動作を行えます。", + "disable-paste-offset/@name": "貼り付けたコスチュームの移動を防止", + "block-duplicate/@description": "Altキーを押したままスクリプトをドラッグし、スクリプトを複製する。Ctrlキーも押すと、ブロックを個別に複製できる。", + "block-duplicate/@info-mac": "macOSでは、Altキーの代わりにOptionキーを、Ctrlキーの代わりにCmdキーを利用できます。", + "block-duplicate/@name": "Altキーでスクリプトを複製", + "swap-local-global/@description": "変数やリストを改名するときに、「すべてのスプライト用」と「このスプライトのみ」や、クラウド変数を切り替えられるようにする。右クリックメニューに簡単に変更するための項目を追加する。", + "swap-local-global/@name": "変数の「すべてのスプライト用」と「このスプライトのみ」を変更", + "editor-comment-previews/@description": "最小化されたコメントやブロックに付属しているコメントの内容を、ホバーしてプレビューできるようにする。", + "editor-comment-previews/@name": "エディター内のコメントプレビュー", + "editor-comment-previews/@settings-name-delay": "待ち時間", + "editor-comment-previews/@settings-name-follow-mouse": "ポインター位置を追随", + "editor-comment-previews/@settings-name-hover-view": "最小化したコメントをプレビュー", + "editor-comment-previews/@settings-name-hover-view-block": "ブロックをホバーして付属のコメントをプレビュー", + "editor-comment-previews/@settings-name-hover-view-procedure": "カスタムブロックをホバーして定義ブロックのコメントをプレビュー", + "editor-comment-previews/@settings-name-reduce-animation": "アニメーションを減らす", + "editor-comment-previews/@settings-name-reduce-transparency": "透明度を減らす", + "editor-comment-previews/@settings-select-delay-long": "長", + "editor-comment-previews/@settings-select-delay-none": "なし", + "editor-comment-previews/@settings-select-delay-short": "短", + "columns/@description": "Scratch 2.0のように、ブロックカテゴリーメニューを2列に分け、ブロックパレットの上部に配置する。", + "columns/@name": "2列カテゴリーメニュー", + "number-pad/@description": "数値を編集するときに、Scratchのナンバーパッド入力をタッチスクリーンデバイス以外のすべてのデバイスで表示する。", + "number-pad/@info-explanation": "「x座標を変える」ブロックなどの数値を変えるときに、ナンバーパッドが表示されるようになります。", + "number-pad/@name": "ナンバーパッドを常に表示", + "script-snap/@description": "スクリプトをドラッグして、コードエリアのドットに整列させる。", + "script-snap/@name": "スクリプトを整列", + "script-snap/@preset-name-default": "デフォルト", + "script-snap/@preset-name-half-block": "0.5ブロック", + "script-snap/@preset-name-whole-block": "1ブロック", + "script-snap/@settings-name-grid": "グリッドのサイズ (px)", + "fullscreen/@description": "全画面表示ボタンをクリックしたとき、ブラウザーの全画面表示を有効化したり、緑の旗のツールバーを隠したりする。", + "fullscreen/@info-hideToolbarNotice": "ツールバーを隠した場合は、Escキーで全画面表示から戻れます。", + "fullscreen/@name": "全画面表示", + "fullscreen/@settings-name-browserFullscreen": "ブラウザーの全画面表示を使用", + "fullscreen/@settings-name-hideToolbar": "ツールバーを隠す", + "hide-stage/@description": "「小さなステージ」と「大きなステージ」ボタンの横に、ステージとスプライトペインを隠してコードエリアを広げるボタンを追加する。", + "hide-stage/@name": "ステージとスプライトペインを隠す", + "editor-stepping/@description": "実行中のブロックの周りに色のついた枠線を表示する。", + "editor-stepping/@name": "実行中のブロック枠線", + "editor-stepping/@settings-name-highlight-color": "枠線の色", + "paint-gradient-maker/@name": "コスチュームグラデーションエディター", + "paint-gradient-maker/@description": "コスチュームエディターにカスタムグラデーションメーカーを追加します。他のグラデーションオプションの横に表示されます。", + "paint-rounded-rect-seperate/@name": "長方形ツールと角丸長方形ツールを分離", + "paint-rounded-rect-seperate/@description": "PenguinModの以前のバージョンのように、別の角丸長方形ツールを追加します。現在の長方形ツールから丸めオプションは削除されません。", + "paint-default-smoothing/@name": "カスタムのデフォルトのブラシ、消しゴム、ペンのスムージング", + "paint-default-smoothing/@description": "ブラシ、消しゴム、ペンのスムージングのデフォルト値を設定可能にします。", + "toolbox-full-blocks-on-hover/@name": "ホバー時にブロックパレットにブロック全体を表示する", + "toolbox-full-blocks-on-hover/@description": "ブロックパレット内のブロックの上にマウスを移動しても、パレット内のすべてのブロックが端で切り取られなくなります。", + "waveform-chunk-size/@name": "高音質波形エディタ", + "waveform-chunk-size/@description": "パフォーマンスを犠牲にして、サウンドエディターの波形プレビューの品質を設定できるようにします。", + "waveform-chunk-size/@info-qualityWarning": "数値が低いほど、波形の作成に使用されるサンプル数が多くなり、パフォーマンスに影響してエディターがクラッシュする可能性があります。", + "waveform-chunk-size/@settings-name-quality": "(n)番目ごとにサンプルを使用する", + "editor-block-chomping/@name": "ラップされたCブロックを拡張する", + "editor-block-chomping/@description": "Scratch 2.0 のように、C ブロックをブロックにラップするときに拡張します。", + "toolbox-category-drag/@name": "ブロックパレット内のドラッグ可能なカテゴリー", + "toolbox-category-drag/@description": "ブロックパレット内のカテゴリをクリックして押したままにすることで、並べ替えることができます。", + "toolbox-category-drag/@info-draggable-incompatibility": "このアドオンは、現在、「2列カテゴリメニュー」アドオンと一緒に有効にすると多少バグが発生します。", + "editor-animations/@name": "エディターアニメーション", + "editor-animations/@description": "エディターのさまざまな要素にスムーズなアニメーションを追加します!", + "editor-animations/@settings-name-animateButtons": "ボタンをアニメーション化", + "editor-animations/@settings-name-animateLibraries": "ライブラリ(コスチューム、スプライト、音など)をアニメーション化", + "editor-animations/@settings-name-animateModals": "モーダル(変数/リスト作成、ブロック定義など)をアニメーション化", + "editor-animations/@settings-name-animateSpeed": "アニメーション速度(1〜500%)", + "editor-animations/@settings-name-animationType": "アニメーションの種類", + "editor-animations/@settings-name-animationDir": "アニメーションの方向", + "editor-animations/@settings-select-animationType-default": "デフォルト", + "editor-animations/@settings-select-animationType-ease": "イーズ", + "editor-animations/@settings-select-animationType-smoothStep": "スムースステップ", + "editor-animations/@settings-select-animationType-fastInSlowOut": "速始緩終", + "editor-animations/@settings-select-animationType-sine": "サイン", + "editor-animations/@settings-select-animationType-quad": "二次関数", + "editor-animations/@settings-select-animationType-cubic": "三次関数", + "editor-animations/@settings-select-animationType-quart": "四次関数", + "editor-animations/@settings-select-animationType-quint": "五次関数", + "editor-animations/@settings-select-animationType-back": "バック", + "editor-animations/@settings-select-animationType-elastic": "弾性", + "editor-animations/@settings-select-animationType-bounce": "バウンス", + "editor-animations/@settings-select-animationType-emphasis": "強調", + "editor-animations/@settings-select-animationDir-In": "入り", + "editor-animations/@settings-select-animationDir-Out": "出", + "editor-animations/@settings-select-animationDir-InOut": "両方", + "editor-animations/@info-reduced-motion-notice": "このアドオンは、システムでアニメーションが無効になっている場合は効果がありません。有効にする方法は https://mgik.dev/turn-on-motion を参照してください。", + "editor-animations/@info-animation-support": "一部のアニメーションタイプは方向の指定に対応していないため、方向が無視される場合があります。", + "paint-tool-panel/@name": "コスチュームツールパネル", + "paint-tool-panel/@description": "オブジェクトの変換とプロパティを手動で編集するためのツール メニューをコスチューム エディターに追加します。" +} \ No newline at end of file diff --git a/src/addons/addons-l10n-settings/ko.json b/src/addons/addons-l10n-settings/ko.json new file mode 100644 index 0000000000000000000000000000000000000000..4f37c51f3aecc848f658ebba4946ca7cece2af00 --- /dev/null +++ b/src/addons/addons-l10n-settings/ko.json @@ -0,0 +1,296 @@ +{ + "cat-blocks/@description": "2020년 만우절의 편집기 고양이 모자 블록을 되돌립니다.", + "cat-blocks/@name": "고양이 블럭", + "cat-blocks/@settings-name-watch": "마우스 커서 바라보기", + "editor-devtools/@name": "개발자 도구", + "editor-devtools/@settings-name-enableCleanUpPlus": "\"블럭 정리하기\" 향상", + "editor-devtools/@settings-name-enablePasteBlocksAtMouse": "마우스 커서로 블럭 붙여넣기", + "find-bar/@description": "스크립트, 모양, 소리 바 옆에 검색 창을 추가합니다. 검색 창을 이용한 후 코드 창에서 Ctrl+Left과 Ctrl+Right를 눌러 이전, 이후 위치로 이동합니다.", + "find-bar/@info-developer-tools": "이 애드온은 과거에 \"개발자 도구\"의 일부였지만 분리되었습니다.", + "find-bar/@name": "에디터 찾기 바", + "jump-to-def/@description": "마우스 중간 버튼 클릭이나 쉬프트+클릭으로 함수 블록의 정의하기 블록으로 이동합니다.", + "jump-to-def/@info-developer-tools": "이 기능은 본래 \"개발자 도구\"의 일부였으나 여기로 이동되었습니다.", + "jump-to-def/@name": "함수 블록의 정의하기 블록으로 이동하기", + "editor-searchable-dropdowns/@description": "블록 드롭다운을 검색할 수 있도록 합니다.", + "editor-searchable-dropdowns/@name": "검색 가능한 드롭다운", + "data-category-tweaks-v2/@description": "블록 카테고리에서 데이터(\"변수\") 카테고리를 개선합니다.", + "data-category-tweaks-v2/@name": "데이터 카테고리 개선", + "data-category-tweaks-v2/@settings-name-moveReportersDown": "데이터 블럭을 변수 리스트 앞으로 보내기", + "data-category-tweaks-v2/@settings-name-separateListCategory": "리스트 카테고리 분리", + "data-category-tweaks-v2/@settings-name-separateLocalVariables": "지역변수 분리", + "block-palette-icons/@description": "색칠된 원형 내부에 블록 카데고리를 식별하는 아이콘을 추가합니다.", + "block-palette-icons/@name": "블럭 팔레트 카테고리 아이콘", + "hide-flyout/@description": "사용되지 않은 경우 블록 팔레트를 숨깁니다. 잠금 아이콘을 클릭하여 일시적으로 제자리에 잠그거나 또는 \"카테고리 클릭\" 모드를 사용하세요.", + "hide-flyout/@info-hoverExplanation": "\"팔레트 영역 미사용\" 모드는 보이는 영역만 확장합니다. 블록을 삭제하지 않고 해당 영역으로 드래그하려면 다른 모드 중 하나를 사용하세요.", + "hide-flyout/@name": "블록 팔레트 자동으로 숨기기", + "hide-flyout/@settings-name-toggle": "토글 켜기", + "hide-flyout/@settings-select-speed-default": "기본", + "hide-flyout/@settings-select-toggle-category": "카테고리 클릭", + "hide-flyout/@settings-select-toggle-cathover": "카테고리에 접근", + "hide-flyout/@settings-select-toggle-hover": "팔레트 영역 접근", + "mediarecorder/@description": "편집기 메뉴 바에 \"녹화 시작\" 버튼을 추가해 프로젝트의 무대를 녹화할 수 있도록 합니다.", + "mediarecorder/@name": "프로젝트 영상 녹화기", + "drag-drop/@description": "파일 탐색기에서 이미지, 소리를 스프라이트 창이나 의상/사운드 목록으로 끌어다 놓을 수 있습니다. 또한 텍스트 파일을 목록으로 끌어다 놓거나 \"묻고 기다리기\" 질문창을 표시할 수 있습니다.", + "drag-drop/@name": "파일 끌어다 놓기", + "drag-drop/@settings-name-use-hd-upload": "고해상도 업로드 사용하기", + "debugger/@name": "디버거", + "debugger/@settings-name-log_broadcasts": "신호 기록하기", + "debugger/@settings-name-log_clear_greenflag": "초록 깃발을 누르면 초기화하기", + "debugger/@settings-name-log_clone_create": "복제본 생성 기록하기", + "debugger/@settings-name-log_failed_clone_creation": "복제본 개수 제한에 도달했을 때 기록하기", + "debugger/@settings-name-log_greenflag": "녹색 깃발 클릭 기록하기", + "debugger/@update": "\"실행 중인 작업\"과 \"성능\" 탭이 새롭게 추가되었습니다.", + "pause/@description": "초록 깃발 옆에 일시 정지 버튼을 추가합니다.", + "pause/@name": "일시정지 버튼", + "mute-project/@description": "녹색 깃발을 Ctrl+클릭하여 프로젝트를 음소거/음소거 해제합니다.", + "mute-project/@name": "프로젝트 플레이어 음소거 모드", + "vol-slider/@description": "정지 버튼 옆에 음량 슬라이더를 추가합니다.", + "vol-slider/@name": "프로젝트 음량 슬라이더", + "vol-slider/@settings-name-defVol": "기본 음량", + "clones/@description": "전체 복제본의 수를 편집기 무대 상단에 표시합니다.", + "clones/@name": "복제본 개수 표시", + "clones/@settings-name-showicononly": "아이콘만 보이기", + "mouse-pos/@description": "마우스의 x/y위치를 편집기 무대의 상단에 표시합니다.", + "mouse-pos/@name": "마우스 위치 표시", + "color-picker/@description": "색상 선택기에 HEX 코드 입력을 추가합니다.", + "color-picker/@name": "HEX 색상 선택기", + "remove-sprite-confirm/@description": "스프라이트를 지울 때 한 번 더 묻습니다.", + "remove-sprite-confirm/@name": "스프라이트 제거 확인", + "block-count/@description": "편집기 메뉴바에 프로젝트의 총 블록 수를 표시합니다. 과거에는 \"스프라이트 및 스크립트 수\"의 일부였습니다.", + "block-count/@name": "블록 수 세기", + "onion-skinning/@description": "모양을 편집할 때 전 모양이나 다음 모양을 투명한 오버레이로 보입니다. 모양 편집기에서 확대 버튼 옆의 버튼으로 동작합니다.", + "onion-skinning/@name": "어니언 스키닝", + "onion-skinning/@settings-name-afterTint": "다음 모양 색상", + "onion-skinning/@settings-name-beforeTint": "이전 모양 색상", + "onion-skinning/@settings-name-default": "기본으로 활성화하기", + "onion-skinning/@settings-name-layering": "기본 레이어화", + "onion-skinning/@settings-name-mode": "기본 모드", + "onion-skinning/@settings-name-next": "기본 다음 모양", + "onion-skinning/@settings-name-opacity": "불투명도 (%)", + "onion-skinning/@settings-name-opacityStep": "투명도 스푸마토 (%)", + "onion-skinning/@settings-name-previous": "기본 이전 모양", + "onion-skinning/@settings-select-layering-behind": "뒤", + "onion-skinning/@settings-select-layering-front": "앞", + "onion-skinning/@settings-select-mode-merge": "이미지 병합", + "onion-skinning/@settings-select-mode-tint": "단색으로 표시", + "default-costume-editor-color/@description": "모양 편집기에서 사용되는 기본 색상과 테두리 크기를 변경합니다.", + "default-costume-editor-color/@name": "모양 편집기 기본 색상 변경", + "default-costume-editor-color/@settings-name-fill": "기본 채우기 색", + "default-costume-editor-color/@settings-name-persistence": "도구를 바꿀 때 색상을 초기화하지 않고 이전 색상을 그대로 사용하기", + "default-costume-editor-color/@settings-name-stroke": "기본 외곽선 색", + "default-costume-editor-color/@settings-name-strokeSize": "기본 외곽선 사이즈", + "bitmap-copy/@description": "다른 웹사이트나 소프트웨어에 붙여넣을 수 있도록 모양 편집기에서 비트맵 이미지를 시스템 클립보드에 복사합니다.", + "bitmap-copy/@info-norightclick": "\"우클릭 → 복사하기\"는 지원하지 않습니다. 당신은 항상 비트맵 이미지를 선택하기 위해선 Ctrl+C를 눌러야 합니다.", + "bitmap-copy/@name": "비트맵 사진 복사", + "2d-color-picker/@description": "채도, 밝기 슬라이더를 2차원 색상 선택기로 바꿉니다. Shift 키를 누른 채로 커서를 드래그해 한 가지의 값을 변경할 수 있습니다.", + "2d-color-picker/@name": "2차원 색상 선택기", + "better-img-uploads/@description": "\"모양 업로드\" 버튼 위에 자동으로 비트맵 사진을 SVG(벡터) 사진으로 바꾸어 낮은 화질을 피하는 버튼을 추가합니다.", + "better-img-uploads/@info-notSuitableEdit": "사진 업로드 후에 편집할 예정이면 고해상도 사진 업로드 버튼을 사용하지 마세요.", + "better-img-uploads/@name": "고해상도 사진 업로드", + "better-img-uploads/@settings-name-fitting": "사진 크기 변경하기", + "better-img-uploads/@settings-select-fitting-fill": "이미지를 늘려 무대에 채우기", + "better-img-uploads/@settings-select-fitting-fit": "이미지를 줄여 무대에 채우기", + "better-img-uploads/@settings-select-fitting-full": "기존 크기", + "pick-colors-from-stage/@description": "모양 편집기의 색상 선택기가 무대에서도 색상을 고를 수 있도록 합니다.", + "pick-colors-from-stage/@name": "모양 편집기에서 무대 색상 고르기", + "custom-block-shape/@description": "블록의 높이, 모서리 곡률. 홈 높이를 조정합니다.", + "custom-block-shape/@info-paddingWarning": "블럭 높이를 줄이는 것은 당신만 볼 수 있기에 프로젝트를 다른 사용자가 볼 때 스크립트가 겹쳐 보일 수 있습니다.", + "custom-block-shape/@name": "블록 모양 사용자 지정", + "custom-block-shape/@preset-description-default2": "스크래치 2.0과 비슷하게 보여집니다.", + "custom-block-shape/@preset-description-default3": "스크래치 3.0에서 일반적으로 보여지는 상태입니다.", + "custom-block-shape/@preset-description-flat2": "홈과 모서리가 제거된 스크래치 2.0 블럭입니다.", + "custom-block-shape/@preset-description-flat3": "홈과 모서리가 제거된 스크래치 3.0 블럭입니다.", + "custom-block-shape/@preset-name-default2": "2.0 블럭", + "custom-block-shape/@preset-name-default3": "3.0 블럭", + "custom-block-shape/@preset-name-flat2": "2.0 플랫", + "custom-block-shape/@preset-name-flat3": "3.0 플랫", + "custom-block-shape/@settings-name-cornerSize": "모서리 크기 (0-300%)", + "custom-block-shape/@settings-name-notchSize": "홈 높이 (0-150%)", + "custom-block-shape/@settings-name-paddingSize": "블럭 높이 (50-200%)", + "zebra-striping/@description": "같은 카테고리의 블록이 서로 포개어져 있을 때, 블록의 색상을 더 연하고 진하게 바꿉니다.", + "zebra-striping/@name": "포개진 블록의 색상 변경", + "zebra-striping/@settings-name-intensity": "채도 (0-100%)", + "zebra-striping/@settings-name-shade": "어둡게", + "zebra-striping/@settings-select-shade-darker": "어둡게", + "zebra-striping/@settings-select-shade-lighter": "더 밝게", + "editor-theme3/@description": "편집기의 각 카테고리에 대한 블록 색상을 편집합니다.", + "editor-theme3/@name": "블록 색상 지정하기", + "editor-theme3/@preset-description-black": "블럭의 배경을 검은색으로 설정합니다.", + "editor-theme3/@preset-description-dark": "기본 색상의 어두운 버전", + "editor-theme3/@preset-description-original": "2.0의 원 색상", + "editor-theme3/@preset-description-tweaks": "이벤트, 제어, 나의 블록 색상을 2.0 블록 색상으로 설정하기", + "editor-theme3/@preset-name-black": "검은색", + "editor-theme3/@preset-name-dark": "어두운 테마", + "editor-theme3/@preset-name-original": "2.0 색상", + "editor-theme3/@preset-name-tweaks": "3.0 개선", + "editor-theme3/@settings-name-Pen-color": "확장 기능", + "editor-theme3/@settings-name-comment-color": "댓글", + "editor-theme3/@settings-name-control-color": "제어", + "editor-theme3/@settings-name-custom-color": "사용자 지정", + "editor-theme3/@settings-name-data-color": "변수", + "editor-theme3/@settings-name-data-lists-color": "리스트", + "editor-theme3/@settings-name-events-color": "이벤트", + "editor-theme3/@settings-name-input-color": "블럭 입력값", + "editor-theme3/@settings-name-looks-color": "형태", + "editor-theme3/@settings-name-motion-color": "동작", + "editor-theme3/@settings-name-operators-color": "연산", + "editor-theme3/@settings-name-sensing-color": "감지", + "editor-theme3/@settings-name-sounds-color": "소리", + "editor-theme3/@settings-name-text": "글자 색", + "editor-theme3/@settings-select-text-black": "검정", + "editor-theme3/@settings-select-text-colorOnBlack": "검은 배경에서의 색", + "editor-theme3/@settings-select-text-colorOnWhite": "흰 배경에서의 색", + "editor-theme3/@settings-select-text-white": "하양", + "custom-block-text/@description": "블록 글자의 두께를 변경하거나 글자 그림자를 선택적으로 추가합니다", + "custom-block-text/@name": "블록 글자 스타일 설정", + "custom-block-text/@settings-name-bold": "글자 굵게 하기", + "custom-block-text/@settings-name-shadow": "글자 아래에 그림자 추가하기", + "editor-colored-context-menus/@description": "우클릭 메뉴에 색상을 입힙니다.", + "editor-colored-context-menus/@name": "우클릭 메뉴 색상", + "editor-stage-left/@description": "스크래치 2.0 처럼 무대를 코드 편집기의 왼쪽으로 옮깁니다.", + "editor-stage-left/@info-reverseOrder": "깃발 버튼과 멈춤 버튼, 전체화면 버튼의 위치를 바꾸려면 \"프로젝트 버튼 위치 반전\" 애드온을 사용하세요.", + "editor-stage-left/@name": "무대를 왼쪽에서 나타내기", + "editor-buttons-reverse-order/@description": "스크래치 2.0처럼 깃발 버튼과 멈춤 버튼을 오른쪽으로, 전체 화면 버튼을 왼쪽으로 옮깁니다.", + "editor-buttons-reverse-order/@name": "프로젝트 버튼 위치 반전", + "variable-manager/@description": "변수 및 리스트를 쉽게 업데이트할 수 있도록 편집기의 \"소리\"탭 옆에 탭을 추가합니다.", + "variable-manager/@name": "변수 관리자", + "search-sprites/@description": "스프라이트 창에 검색창을 추가해 이름으로 스프라이트를 검색합니다.", + "search-sprites/@name": "이름으로 스프라이트 검색", + "gamepad/@description": "USB 또는 Bluetooth 컨트롤러/게임 패드를 사용하여 프로젝트와 상호작용합니다.", + "gamepad/@name": "게임패드 지원", + "gamepad/@settings-name-hide": "컨트롤러가 감지되지 않았을 때 설정 버튼 숨기기", + "editor-sounds/@description": "블록을 연결하거나 삭제할 때 음향 효과를 재생합니다.", + "editor-sounds/@name": "편집기 음향 효과", + "folders/@info-notice-folders-are-public": "이 기능을 사용하도록 설정한 사용자는 프로젝트의 폴더를 볼 수 있습니다. 다른 사용자는 정상적으로 스프라이트 목록을 볼 수 있습니다(폴더 없음).", + "folders/@name": "스프라이트 폴더", + "block-switching/@description": "블럭을 마우스 오른쪽 버튼으로 클릭하여 관련 블럭으로 전환합니다.", + "block-switching/@name": "블럭 바꾸기", + "block-switching/@settings-name-control": "제어 블럭", + "block-switching/@settings-name-customargs": "사용자 지정 블록 인수", + "block-switching/@settings-name-customargsmode": "인수 설정에 사용자 지정 블록을 보입니다.", + "block-switching/@settings-name-data": "데이터 블럭", + "block-switching/@settings-name-event": "이벤트 블럭", + "block-switching/@settings-name-extension": "확장 블럭", + "block-switching/@settings-name-looks": "형태 블럭", + "block-switching/@settings-name-motion": "움직임 블럭", + "block-switching/@settings-name-noop": "블록을 자체 변경 설정을 표시합니다.", + "block-switching/@settings-name-operator": "연산 블럭", + "block-switching/@settings-name-sensing": "감지 블럭", + "block-switching/@settings-name-sound": "소리 블럭", + "block-switching/@settings-select-customargsmode-all": "스프라이트 내 모든 사용자 지정 블록의 인수", + "block-switching/@settings-select-customargsmode-defOnly": "사용자 지정 블록의 인수", + "load-extensions/@description": "음악, 펜, 그리고 다른 확장 기능들을 편집기 블록 카테고리에 자동으로 추가합니다.", + "load-extensions/@name": "확장 기능 자동 추가하기", + "load-extensions/@settings-name-music": "음악", + "load-extensions/@settings-name-pen": "펜", + "load-extensions/@settings-name-text2speech": "음성 합성 변환(TTS)", + "load-extensions/@settings-name-translate": "번역", + "custom-zoom/@description": "프로젝트 코드 편집기에서 줌의 최소, 최대, 속도 및 시작 크기를 사용자 지정하고 조작을 자동으로 숨깁니다", + "custom-zoom/@name": "코드 영역 확대/축소 사용자 지정하기", + "custom-zoom/@settings-name-autohide": "줌 제어 자동 숨기기", + "custom-zoom/@settings-name-maxZoom": "최대 확대 (100-500%)", + "custom-zoom/@settings-name-minZoom": "최소 줌 (1-100%)", + "custom-zoom/@settings-name-startZoom": "시작 줌 (50-500%)", + "custom-zoom/@settings-name-zoomSpeed": "줌 속도 (50-200%)", + "custom-zoom/@settings-select-speed-default": "기본", + "initialise-sprite-position/@description": "새 스프라이트의 기본 x/y 위치를 변경합니다.", + "initialise-sprite-position/@name": "새 스프라이트 위치 사용자 지정하기", + "initialise-sprite-position/@settings-name-library": "라이브러리 스프라이트의 위치 임의 지정", + "initialise-sprite-position/@settings-name-x": "X 좌표", + "initialise-sprite-position/@settings-name-y": "Y 좌표", + "initialise-sprite-position/@settings-select-duplicate-randomize": "무작위", + "blocks2image/@description": "코드 영역을 우클릭해 블럭을 SVG/PNG 사진으로 내보냅니다.", + "blocks2image/@name": "블럭을 이미지로 저장", + "remove-curved-stage-border/@description": "모서리를 볼 수 있도록 무대 주위의 곡선 테두리를 제거합니다.", + "remove-curved-stage-border/@name": "무대 테두리 곡선 제거", + "transparent-orphans/@description": "분리된 블럭(맨 위에 모자 블럭이 없는 블럭) 및 드래그 중인 블럭에 대한 별도의 설정을 사용하여 편집기에서 블럭의 투명도를 조정합니다.", + "transparent-orphans/@name": "블럭 투명도", + "transparent-orphans/@settings-name-block": "블럭 투명도 (%)", + "transparent-orphans/@settings-name-dragged": "드래그되는 물체 투명도 (%)", + "transparent-orphans/@settings-name-orphan": "연결 해제 블럭 투명도 (%)", + "paint-by-default/@description": "\"스프라이트/모양/배경/소리 고르기\" 버튼의 기본 동작을 변경합니다.", + "paint-by-default/@name": "모양을 기본적으로 채우기", + "paint-by-default/@settings-name-backdrop": "무대 추가하기", + "paint-by-default/@settings-name-costume": "모양 추가하기", + "paint-by-default/@settings-name-sound": "소리 추가하기", + "paint-by-default/@settings-name-sprite": "스크라이트 추가하기", + "paint-by-default/@settings-select-backdrop-library": "자료실", + "paint-by-default/@settings-select-backdrop-paint": "채우기", + "paint-by-default/@settings-select-backdrop-surprise": "서프라이즈", + "paint-by-default/@settings-select-backdrop-upload": "올리기", + "paint-by-default/@settings-select-costume-library": "라이브러리", + "paint-by-default/@settings-select-costume-paint": "채우기", + "paint-by-default/@settings-select-costume-surprise": "서프라이즈", + "paint-by-default/@settings-select-costume-upload": "올리기", + "paint-by-default/@settings-select-sound-library": "자료실", + "paint-by-default/@settings-select-sound-record": "녹화하기", + "paint-by-default/@settings-select-sound-surprise": "서프라이즈", + "paint-by-default/@settings-select-sound-upload": "올리기", + "paint-by-default/@settings-select-sprite-library": "라이브러리", + "paint-by-default/@settings-select-sprite-paint": "채우기", + "paint-by-default/@settings-select-sprite-surprise": "서프라이즈", + "paint-by-default/@settings-select-sprite-upload": "업로드", + "block-cherry-picking/@description": "Ctrl 키를 누른 상태에서 아래에 연결된 전체 블럭을 가져오는 대신 스크립트 중간의 개별 블록을 드래그하는 기능을 추가합니다.", + "block-cherry-picking/@info-flipControls": "\"제어 뒤집기\"가 활성화된다면, 개별 블록을 잡는 것이 기본 기능이 됩니다. Ctrl을 누르는 것이 전체 항목을 드래그합니다", + "block-cherry-picking/@info-macContextDisabled": "macOS에서는, Ctrl 키 대신 Cmd키를 사용하세요.", + "block-cherry-picking/@name": "Ctrl 키를 눌러 개별 블록 잡기", + "block-cherry-picking/@settings-name-invertDrag": "제어 뒤집기", + "hide-new-variables/@description": "새 변수나 리스트가 생성되었을 때 자동으로 모니터를 생성하지 않습니다.", + "hide-new-variables/@name": "새 변수 숨기기", + "editor-extra-keys/@info-experimentalKeysWarn": "\"실험적 키\"에는 등호, 슬래시, 세미콜론 등이 포합됩니다. 키보드 배열이나 운영 체제에 따라서 작동하지 않을 수도 있습니다.", + "editor-extra-keys/@info-shiftKeysWarn": "\"Shift 키\"에는 Shift와 같이 눌러야 하는 해시태그, 느낌표 등이 포합됩니다. 이 키들은 \"()키를 눌렀을 때\"블록에서만 작동하고, 키보드 배열이나 운영 체젱에 따라서 작동하지 않을 수 있습니다.", + "editor-extra-keys/@name": "추가 키 설정", + "editor-extra-keys/@settings-name-experimentalKeys": "실험적 키 보이기", + "editor-extra-keys/@settings-name-shiftKeys": "Shift 키 보이기", + "hide-delete-button/@description": "삭제 버튼(쓰래기통 아이콘)을 스프라이트, 모양, 소리에서 삭제합니다. 우클릭 메뉴에서는 여전히 삭제할 수 있습니다.", + "hide-delete-button/@name": "삭제 버튼 숨기기", + "hide-delete-button/@settings-name-costumes": "모양과 배경", + "hide-delete-button/@settings-name-sounds": "소리", + "hide-delete-button/@settings-name-sprites": "스프라이트", + "no-script-bumping/@description": "스크립트를 움직이고 변경해도 스크립트끼리 겹칠 때 스크립트가 돌아다니지 않게 합니다.", + "no-script-bumping/@name": "스크립트끼리 겹칠 때 자동 여백 만들지 않기", + "disable-stage-drag-select/@description": "편집기 무대에서(드래그가 가능하도록 설정된 스프라이트 제외) 스프라이트 드래그를 막습니다. 시프트 키를 누르면 스프라이트가 정상적으로 드래그됩니다.", + "disable-stage-drag-select/@name": "편집기에서 스프라이트 드래그 끄기", + "move-to-top-bottom/@description": "모양이나 음악을 리스트의 시작이나 끝으로 음직일 수 있는 우클릭 매뉴를 추가합니다.", + "move-to-top-bottom/@info-developer-tools": "이 애드온은 과거에 \"개발자 도구\"의 일부였지만 분리되었습니다.", + "move-to-top-bottom/@name": "모양 블록을 맨 위로 올리거나 맨 아래로 내리기", + "disable-paste-offset/@description": "모양 편집기에서 복사한 모양을 살짝 이동시키지 않고 원래 위치에 붙여넣습니다.", + "disable-paste-offset/@name": "불여넣어진 아이템 원래 자리에 놓기", + "block-duplicate/@description": "Alt 키를 누르면서 스크립트를 드래그해 빠르게 복제합니다. Ctrl 키를 같이 누르면 한 개의 스크립트만 복사됩니다.", + "block-duplicate/@info-mac": "맥OS에서는 Alt 키 대신 옵션 키를 이용하고, Ctrl 키 대신 Cmd키를 이용하세요.", + "block-duplicate/@name": "Alt 키로 스크립트 복제하기", + "rename-broadcasts/@description": "신호 블록 드롭다운에 신호 이름을 변경할 수 있는 옵션을 제공합니다.", + "rename-broadcasts/@name": "신호 이름 변경하기", + "swap-local-global/@description": "기존 변수 또는 목록의 이름을 바꿀 때 추가 설정을 추가합니다. \"모든 스프라이트의 경우\"와 \"이 스프라이트의 경우에만\" 사이에서 변경할 수 있고 변수가 클라우드에 저장되는지 여부를 변경할 수 있습니다. 또한 변수/리스트를 마우스 오른쪽 단추로 클릭하여 범위를 빠르게 변경할 수 있는 설정을 추가합니다.", + "swap-local-global/@name": "변수의 '모든 스프라이트에서 사용'과 '이 스프라이트에서만 사용'을 전환하기", + "editor-comment-previews/@description": "접혀 있는 주석이나 블록 위에 마우스를 올려놓아 주석의 내용을 미리볼 수 있도록 합니다. 이를 통해 화면 밖에서 주석을 보고, 미리보기로 루프 블록을 아래쪽에서 확인하며, 작은 공간에 많은 긴 주석을 맞추는 등의 작`업을 수행할 수 있습니다.", + "editor-comment-previews/@name": "편집기 댓글 미리보기", + "editor-comment-previews/@settings-name-delay": "지연 시간", + "editor-comment-previews/@settings-name-follow-mouse": "마우스 따라가기", + "editor-comment-previews/@settings-name-hover-view": "주석 위에 마우스를 올려놓아 미리보기", + "editor-comment-previews/@settings-name-hover-view-block": "사용자 지정 블록 위에 마우스를 올려놓아 붙여진 주석 미리보기", + "editor-comment-previews/@settings-name-hover-view-procedure": "사용자 지정 블록 위에 마우스를 올려놓아 정의 주석 미리보기", + "editor-comment-previews/@settings-name-reduce-animation": "모션 줄이기", + "editor-comment-previews/@settings-name-reduce-transparency": "투명도 줄이기", + "editor-comment-previews/@settings-select-delay-long": "길게", + "editor-comment-previews/@settings-select-delay-none": "없음", + "editor-comment-previews/@settings-select-delay-short": "짧게", + "columns/@description": "블럭 카테고리 메뉴를 두 줄로 쪼개 스크래치 2.0처럼 블록 팔레트의 맨 위로 옮깁니다.", + "columns/@name": "2열 카테고리 메뉴", + "script-snap/@description": "스크립트를 드래그해 코드 영역 점에 자동으로 정렬합니다.", + "script-snap/@name": "스크립트를 격자에 맟추기", + "script-snap/@preset-name-default": "기본", + "script-snap/@preset-name-half-block": "반 블록 크기", + "script-snap/@preset-name-whole-block": "한 블록 크기", + "script-snap/@settings-name-grid": "격자 크기 (px)", + "fullscreen/@description": "전체 화면 모드에서 발생하는 몇몇 의도하지 않은 효과들을 고치고, 브라우저의 전체 화면 모드로 열 수 있으며, 녹색 깃발 툴바를 숨깁니다.", + "fullscreen/@info-hideToolbarNotice": "만약 툴바 숨기기를 선택했다면, Esc키를 눌러 전체 화면 모드에서 나가세요.", + "fullscreen/@name": "향상된 전체 화면", + "fullscreen/@settings-name-browserFullscreen": "전체 화면 플레리어를 전체 화면 브라우저 모드에서 열기", + "fullscreen/@settings-name-hideToolbar": "전체 화면에서 툴바 숨기기", + "hide-stage/@description": "무대와 스프라이트 탭을 숨기는 \"무대 숨기기\" 버튼을 추가하여 코드 편집기를 더 크게 사용할 수 있습니다.", + "hide-stage/@name": "무대와 스프라이트 탭 숨기기", + "editor-stepping/@description": "프로젝트에서 현재 실행 중인 블록을 색으로 강조합니다.", + "editor-stepping/@name": "실행 블록 테두리", + "editor-stepping/@settings-name-highlight-color": "강조색" +} \ No newline at end of file diff --git a/src/addons/addons-l10n-settings/nl.json b/src/addons/addons-l10n-settings/nl.json new file mode 100644 index 0000000000000000000000000000000000000000..b550504db714f7f57f34d582ce12e8e5af58890f --- /dev/null +++ b/src/addons/addons-l10n-settings/nl.json @@ -0,0 +1,344 @@ +{ + "cat-blocks/@description": "Brengt de kat-blokken in de editor van 1 April 2020 terug.", + "cat-blocks/@info-watch": "De instelling \"Kijk naar muisaanwijzer\" vermindert mogelijk prestaties wanneer de editor is geopend.", + "cat-blocks/@name": "Kat-blokken", + "cat-blocks/@settings-name-watch": "Kijk naar muisaanwijzer", + "editor-devtools/@description": "Voegt nieuwe menuopties toe aan de editor: blokken kopiëren/plakken, beter opruimen, en meer!", + "editor-devtools/@name": "Ontwikkelaarstools", + "editor-devtools/@settings-name-enableCleanUpPlus": "\"Blokken opruimen\" Verbeteren", + "editor-devtools/@settings-name-enablePasteBlocksAtMouse": "Blokken plakken bij muisaanwijzer", + "find-bar/@description": "Maakt een nieuwe zoekbalk waarmee je scripts, uiterlijken en geluiden kunt zoeken en ernaar kunt springen, naast het geluidentabblad. Gebruik Ctrl+Links en Ctrl+Rechts in het codegebied om te navigeren naar vorige of volgende bezochte posities na het gebruiken van de zoekbalk.", + "find-bar/@info-developer-tools": "Deze addon maakte voorheen deel uit van de \"ontwikkelaarstools\"-addon maar is nu hierheen verhuisd.", + "find-bar/@name": "Zoekbalk in editor", + "middle-click-popup/@description": "Klik met de scrolwielknop op het codegebied of gebruik Ctrl+Spatie of Shift+Klik om een zwevend invoervak zichtbaar te maken, waar je de naam van een blok (of een deel ervan) kunt typen en het naar het codegebied kunt slepen. Houd Shift ingedrukt tijdens het slepen om het vak niet te sluiten.", + "middle-click-popup/@info-developer-tools": "Deze addon maakte voorheen deel uit van de \"ontwikkelaarstools\"-addon maar is nu hierheen verhuisd.", + "middle-click-popup/@name": "Blokken invoegen op naam", + "jump-to-def/@description": "Spring naar een definitie van een eigen blok met de scrolwielknop of Shift+Klik op het blok.", + "jump-to-def/@info-developer-tools": "Deze addon maakte voorheen deel uit van de \"ontwikkelaarstools\"-addon maar is nu hierheen verhuisd.", + "jump-to-def/@name": "Springen naar definitie van eigen blok", + "editor-searchable-dropdowns/@description": "Geeft je de mogelijkheid om blok-dropdownitems te zoeken.", + "editor-searchable-dropdowns/@name": "Doorzoekbare dropdowns", + "data-category-tweaks-v2/@description": "Maakt aanpassingen aan de Gegevens (\"Variabelen\")-blokcategorie.", + "data-category-tweaks-v2/@name": "Gegevenscategorie-aanpassingen", + "data-category-tweaks-v2/@settings-name-moveReportersDown": "Verplaats gegevensblokken boven variabelenlijst", + "data-category-tweaks-v2/@settings-name-separateListCategory": "Aparte Lijstcategorie", + "data-category-tweaks-v2/@settings-name-separateLocalVariables": "Aparte \"Voor Deze Sprite\"-Variabelen", + "block-palette-icons/@description": "Voegt pictogrammen binnen de gekleurde cirkels van blokcategorieën toe.", + "block-palette-icons/@name": "Pictogrammen voor categorieën in blokpalet", + "hide-flyout/@description": "Verbergt het blokpalet als niet gefocust. Klik op het slotpictogram om het tijdelijk vast te zetten. Gebruik de \"categorie-klik\"-modus als alternatief.", + "hide-flyout/@info-hoverExplanation": "\"Over paletgebied zweven\" verbreedt alleen het zichtgebied. Als je blokken naar dat gebied wilt slepen zonder dat ze verwijderd worden, gebruik dan een van de andere modi.", + "hide-flyout/@name": "Blokpalet automatisch verbergen", + "hide-flyout/@settings-name-speed": "Animatiesnelheid", + "hide-flyout/@settings-name-toggle": "Aanzetten...", + "hide-flyout/@settings-select-speed-default": "Standaard", + "hide-flyout/@settings-select-speed-long": "Traag", + "hide-flyout/@settings-select-speed-none": "Meteen", + "hide-flyout/@settings-select-speed-short": "Vlug", + "hide-flyout/@settings-select-toggle-category": "Categorieën klikken", + "hide-flyout/@settings-select-toggle-cathover": "Over categorieën zweven", + "hide-flyout/@settings-select-toggle-hover": "Over paletgebied zweven", + "hide-flyout/@update": "Deze addon is verbeterd en er zijn veel bugs opgelost.", + "mediarecorder/@description": "Voegt een \"opname starten\"-knop aan de editortaakbalk toe die je het speelveld laat opnemen.", + "mediarecorder/@name": "Projectvideo-opnemer", + "drag-drop/@description": "Laat je afbeeldingen en geluiden slepen van je bestandsverkenner in het spritevenster of kostuum-/geluidlijst. Je kunt ook tekstbestanden naar lijsten of naar \"vraag en wacht\"-invoeren slepen.", + "drag-drop/@name": "Bestand slepen en neerzetten", + "drag-drop/@settings-name-use-hd-upload": "Gebruik HD-uploads", + "debugger/@settings-name-log_broadcasts": "Signalen loggen", + "debugger/@settings-name-log_clear_greenflag": "Logs wissen op groene vlag", + "debugger/@settings-name-log_clone_create": "Klooncreaties loggen", + "debugger/@settings-name-log_failed_clone_creation": "Log wanneer maximale klonen bereikt zijn", + "debugger/@settings-name-log_greenflag": "Groene vlag-kliks loggen", + "debugger/@update": "Nieuwe \"Threads\" en \"Prestaties\"-vensters in de debugger.", + "pause/@description": "Voegt een pauzeerknop toe naast de groene vlag.", + "pause/@name": "Pauzeerknop", + "mute-project/@description": "Ctrl+Klik de groene vlag om het project te dempen/dempen opheffen.", + "mute-project/@info-macOS": "Gebruik de Cmd-toets in plaats van Ctrl op macOS.", + "mute-project/@name": "Gedempte projectspeler", + "vol-slider/@description": "Voegt een volumeschuifregelaar toe naast de start-/stopbesturingen", + "vol-slider/@name": "Volumeschuifregelaar in projecten", + "vol-slider/@settings-name-defVol": "Standaardvolume", + "clones/@description": "Voegt een teller boven het speelveld toe in de editor die het totale aantal klonen laat zien.", + "clones/@name": "Kloonteller", + "clones/@settings-name-showicononly": "Alleen pictogram tonen", + "mouse-pos/@description": "Laat de x/y-posities van je muisaanwijzer zien boven het speelveld in de editor.", + "mouse-pos/@name": "Muispositie", + "color-picker/@description": "Voegt hex-codeingangen toe aan kleurenkiezers.", + "color-picker/@name": "Hex-kleurenkiezer", + "remove-sprite-confirm/@description": "Vraagt of je zeker weet dat je een sprite in een project wilt verwijderen.", + "remove-sprite-confirm/@name": "Sprite verwijderen bevestigen", + "block-count/@description": "Laat je het totaal aantal blokken in een project zien in de menubalk van de editor. Hoorde vroeger bij \"sprite- en scriptteller\".", + "block-count/@name": "Blokkenteller", + "onion-skinning/@description": "Laat doorzichtige lagen van vorige of volgende uiterlijken zien bij het bewerken van uiterlijken. Bestuurd door knoppen onder de uiterlijkeditor bij de zoomknoppen.", + "onion-skinning/@name": "\"Onion skinning\"", + "onion-skinning/@settings-name-afterTint": "Volgend uiterlijk-tint", + "onion-skinning/@settings-name-beforeTint": "Vorig uiterlijk-tint", + "onion-skinning/@settings-name-default": "Standaard inschakelen", + "onion-skinning/@settings-name-layering": "Standaardlagen", + "onion-skinning/@settings-name-mode": "Standaardmodus", + "onion-skinning/@settings-name-next": "Standaard volgende uiterlijken", + "onion-skinning/@settings-name-opacity": "Doorzichtigheid (%)", + "onion-skinning/@settings-name-opacityStep": "Doorzichtigheidsstap (%)", + "onion-skinning/@settings-name-previous": "Standaard vorige uiterlijken", + "onion-skinning/@settings-select-layering-behind": "Achter", + "onion-skinning/@settings-select-layering-front": "Voor", + "onion-skinning/@settings-select-mode-merge": "Afbeeldingen samenvoegen", + "onion-skinning/@settings-select-mode-tint": "Kleurtint", + "paint-snap/@description": "Objecten in de uiterlijkeditor uitlijnen op begrenzende vakken en vectorknooppunten.", + "paint-snap/@name": "Uitlijnen in uiterlijkeditor", + "paint-snap/@settings-name-boxCenter": "Uitlijnen vanaf middelpunt selectie", + "paint-snap/@settings-name-boxCorners": "Uitlijnen vanaf hoeken selectie", + "paint-snap/@settings-name-boxEdgeMids": "Uitlijnen vanaf middelpunten op randen selectie", + "paint-snap/@settings-name-enable-default": "Standaard inschakelen", + "paint-snap/@settings-name-guide-color": "Hulpkleur bij uitlijnen", + "paint-snap/@settings-name-objectCenters": "Uitlijnen op objectmiddelpunten", + "paint-snap/@settings-name-objectCorners": "Uitlijnen op objecthoeken", + "paint-snap/@settings-name-objectEdges": "Uitlijnen op objectranden", + "paint-snap/@settings-name-objectMidlines": "Uitlijnen op objectmiddenlijnen", + "paint-snap/@settings-name-pageAxes": "Uitlijnen op X- en Y-assen van pagina", + "paint-snap/@settings-name-pageCenter": "Uitlijnen op paginamiddelpunt", + "paint-snap/@settings-name-pageCorners": "Uitlijnen op paginahoeken", + "paint-snap/@settings-name-pageEdges": "Uitlijnen op paginaranden", + "paint-snap/@settings-name-threshold": "Uitlijnafstand", + "default-costume-editor-color/@description": "Verandert de standaardkleuren en -randgrootte in de uiterlijkeditor.", + "default-costume-editor-color/@name": "Aanpasbare standaardkleuren in uiterlijkeditor", + "default-costume-editor-color/@settings-name-fill": "Standaard opvulkluur", + "default-costume-editor-color/@settings-name-persistence": "Gebruik vorige kleur in plaats van resetten na het veranderen van gereedschappen", + "default-costume-editor-color/@settings-name-stroke": "Standaard randkleur", + "default-costume-editor-color/@settings-name-strokeSize": "Standaard randgrootte", + "bitmap-copy/@description": "Geeft je de mogelijkheid om bitmapafbeeldingen van de kostuumeditor te kopiëren naar je klembord, zodat je het in andere websites of software kunt plakken.", + "bitmap-copy/@info-norightclick": "\"Rechterklik → kopiëren\" is niet ondersteund. Je moet Ctrl+C indrukken terwijl een bitmapafbeelding is geselecteerd.", + "bitmap-copy/@name": "Bitmapafbeeldingen kopiëren", + "2d-color-picker/@description": "Vervangt saturatie- en helderheidschuifregelaars in de uiterlijkeditor met een 2D-kleurenkiezer. Houd Shift ingedrukt en beweeg de muisaanwijzer om de waarden op een enkele as te veranderen.", + "2d-color-picker/@name": "2D-kleurenkiezer", + "better-img-uploads/@description": "Voegt een nieuwe knop toe boven de \"upload uiterlijk\"-knop die geüploade bitmapafbeeldingen automatisch converteert naar SVG (vector)-afbeeldingen om de kwaliteit te behouden.", + "better-img-uploads/@info-notSuitableEdit": "Vermijd het gebruiken van de HD-uploadknop als je later nog de afbeelding wilt bewerken.", + "better-img-uploads/@name": "HD-afbeelding uploads", + "better-img-uploads/@settings-name-fitting": "Afbeeldingsgrootte", + "better-img-uploads/@settings-select-fitting-fill": "Rekken om speelveld te vullen", + "better-img-uploads/@settings-select-fitting-fit": "Krimpen om in speelveld te passen", + "better-img-uploads/@settings-select-fitting-full": "Originele grootte", + "pick-colors-from-stage/@description": "Kies kleuren in het speelveld met de kleurenkiezer van de uiterlijkeditor.", + "pick-colors-from-stage/@name": "Speelveldkleuren selecteren in de uiterlijkeditor", + "custom-block-shape/@description": "Verander de opvulling, hoekgrootte, en inkepingshoogte van blokken.", + "custom-block-shape/@info-paddingWarning": "De opvulling verminderen is alleen zichtbaar voor jou, dus als anderen je project bekijken, kunnen je scripts elkaar bedekken.", + "custom-block-shape/@name": "Aanpasbare blokvorm", + "custom-block-shape/@preset-description-default2": "Een uiterlijk dat lijkt op Scratch 2.0-blokken", + "custom-block-shape/@preset-description-default3": "Het normale uiterlijk van Scratch-3.0 blokken", + "custom-block-shape/@preset-description-flat2": "Scratch 2.0-blokken zonder inkepingen en hoeken", + "custom-block-shape/@preset-description-flat3": "Scratch 3.0-blokken zonder inkepingen en hoeken", + "custom-block-shape/@preset-name-default2": "2.0-Blokken", + "custom-block-shape/@preset-name-default3": "3.0-Blokken", + "custom-block-shape/@preset-name-flat2": "2.0 Plat", + "custom-block-shape/@preset-name-flat3": "3.0 Plat", + "custom-block-shape/@settings-name-cornerSize": "Hoekgrootte (0-300%)", + "custom-block-shape/@settings-name-notchSize": "Inkepinghoogte (0-150%)", + "custom-block-shape/@settings-name-paddingSize": "Opvulling (50-200%)", + "zebra-striping/@description": "Wisselt de tinten van blokken met dezelfde kleur tussen licht en donker af wanneer ze in elkaar genest zijn. Dit staat ook bekend als zebrastrepen.", + "zebra-striping/@name": "Afwisselende kleuren van geneste blokken", + "zebra-striping/@settings-name-intensity": "Intensiteit (0-100%)", + "zebra-striping/@settings-name-shade": "Tint", + "zebra-striping/@settings-select-shade-darker": "Donkerder", + "zebra-striping/@settings-select-shade-lighter": "Lichter", + "editor-theme3/@description": "Pas blokkleuren aan voor elke categorie in de editor.", + "editor-theme3/@name": "Aanpasbare blokkleuren", + "editor-theme3/@preset-description-black": "Maakt blok-achtergronden zwart", + "editor-theme3/@preset-description-dark": "Donkere versies van de standaardkleuren", + "editor-theme3/@preset-description-original": "De originele blokkleuren van Scratch 2.0", + "editor-theme3/@preset-description-tweaks": "Gebeurtenissen, Besturing, en Eigen blokken met 2.0-kleuren", + "editor-theme3/@preset-name-black": "Zwart", + "editor-theme3/@preset-name-dark": "Donker", + "editor-theme3/@preset-name-original": "2.0-kleuren", + "editor-theme3/@preset-name-tweaks": "3.0-Aanpassingen", + "editor-theme3/@settings-name-Pen-color": "extensies", + "editor-theme3/@settings-name-comment-color": "Opmerkingen", + "editor-theme3/@settings-name-control-color": "besturen", + "editor-theme3/@settings-name-custom-color": "aanpasbaar", + "editor-theme3/@settings-name-data-color": "variabelen", + "editor-theme3/@settings-name-data-lists-color": "lijsten", + "editor-theme3/@settings-name-events-color": "gebeurtenissen", + "editor-theme3/@settings-name-input-color": "Blok-invoer", + "editor-theme3/@settings-name-looks-color": "uiterlijken", + "editor-theme3/@settings-name-motion-color": "beweging", + "editor-theme3/@settings-name-operators-color": "functies", + "editor-theme3/@settings-name-sensing-color": "waarnemen", + "editor-theme3/@settings-name-sounds-color": "geluid", + "editor-theme3/@settings-name-text": "Tekstkleur", + "editor-theme3/@settings-select-text-black": "Zwart", + "editor-theme3/@settings-select-text-colorOnBlack": "Gekleurd op zwarte achtergrond", + "editor-theme3/@settings-select-text-colorOnWhite": "Gekleurd op witte achtergrond", + "editor-theme3/@settings-select-text-white": "Wit", + "editor-theme3/@update": "De \"Donkere opmerkingen\"-instelling van \"Donkere modus in editor en aanpasbare kleuren\" is hierheen verplaatst en is nu aanpasbaar.", + "custom-block-text/@description": "Verandert de dikte van de bloktekst en voegt eventueel een tekstschaduw toe.", + "custom-block-text/@name": "Bewerkbare bloktekststijlen", + "custom-block-text/@settings-name-bold": "Dikgedrukte tekst", + "custom-block-text/@settings-name-shadow": "Tekstschaduw", + "editor-colored-context-menus/@description": "Geeft rechterklikmenu's van blokken een kleur.", + "editor-colored-context-menus/@name": "Gekleurde rechterklikmenu's", + "editor-stage-left/@description": "Zet het speelveld aan de linkerkant van de editor, zoals in Scratch 2.0.", + "editor-stage-left/@info-reverseOrder": "Om de positie van de knoppen boven het speelveld aan te passen, gebruik de \"volgorde van projectbesturingen omkeren\"-addon.", + "editor-stage-left/@name": "Zet speelveld aan linkerkant", + "editor-buttons-reverse-order/@description": "Verplaatst de groene vlag en stopknop naar rechts en de volledig scherm-knop naar links, zoals in Scratch 2.0.", + "editor-buttons-reverse-order/@name": "Volgorde van projectbesturingen omkeren", + "variable-manager/@description": "Voegt een tabblad naast \"geluiden\" toe in de editor om makkelijk variabelen en lijsten aan te passen.", + "variable-manager/@name": "Variabele manager", + "variable-manager/@update": "Lijstvoorwerpen kunnen nu ingevoegd worden zonder de Shifttoets ingedrukt te houden.", + "search-sprites/@description": "Voegt een zoekbalk aan het spritevenster toe om sprites bij naam te zoeken.", + "search-sprites/@name": "Sprites bij naam zoeken", + "sprite-properties/@description": "Verbergt het sprite-eigenschappenpaneel zoals in Scratch 2.0. Klik op de infoknop in de huidige sprite of dubbelklik een sprite om het paneel weer te laten verschijnen. Om het weer te verbergen gebruik je de samenvouwknop in het paneel of dubbelklik een sprite.", + "sprite-properties/@name": "Sprite-eigenschappen samenvouwen", + "sprite-properties/@settings-name-autoCollapse": "Automatisch samenvouwen wanneer muis buiten paneel beweegt", + "sprite-properties/@settings-name-hideByDefault": "Paneel standaard samenvouwen", + "sprite-properties/@settings-name-transitionDuration": "Animatiesnelheid", + "sprite-properties/@settings-select-transitionDuration-default": "Standaard", + "sprite-properties/@settings-select-transitionDuration-long": "Traag", + "sprite-properties/@settings-select-transitionDuration-none": "Meteen", + "sprite-properties/@settings-select-transitionDuration-short": "Vlug", + "gamepad/@description": "Gebruik projecten met een USB- of Bluetooth-controller/gamepad", + "gamepad/@name": "Gamepad-ondersteuning", + "gamepad/@settings-name-hide": "Instellingsknop verbergen als er geen controllers gevonden zijn", + "editor-sounds/@description": "Speelt geluiden af wanneer je blokken verbindt of verwijdert.", + "editor-sounds/@name": "Editor-geluidseffecten", + "folders/@description": "Voegt mappen toe aan het spritevenster, en ook uiterlijk- en geluidlijsten. Om een map aan te maken, gebruik de rechtermuisknop op een sprite en klik op \"map aanmaken\". Klik op een map om het te openen of te sluiten. Gebruik de rechtermuisknop op een sprite om te zien naar welke mappen je het kunt verplaatsen, of sleep het naar een geopende map. Deze functie werkt door \"[folderName]//\" aan het begin van de namen van je sprites toe te voegen.", + "folders/@info-notice-folders-are-public": "Gebruikers met deze functie zullen mappen kunnen zien in je project. Alle anderen zien de sprites normaal (zonder mappen).", + "folders/@name": "Spritemappen", + "block-switching/@description": "Rechtermuisknop op een blok om het te wisselen naar een gerelateerde blok.", + "block-switching/@name": "Blokken wisselen", + "block-switching/@settings-name-control": "Besturen-blokken", + "block-switching/@settings-name-customargs": "Eigen blokken-argumenten", + "block-switching/@settings-name-customargsmode": "Zichtbare eigen blokken-argumentopties", + "block-switching/@settings-name-data": "Gegevens-blokken", + "block-switching/@settings-name-event": "Gebeurtenis-blokken", + "block-switching/@settings-name-extension": "Extensieblokken", + "block-switching/@settings-name-looks": "Uiterlijken-blokken", + "block-switching/@settings-name-motion": "Beweging-blokken", + "block-switching/@settings-name-noop": "Laat optie zien om blok naar zichzelf te wisselen", + "block-switching/@settings-name-operator": "Functies-blokken", + "block-switching/@settings-name-sensing": "Waarnemen-blokken", + "block-switching/@settings-name-sound": "Geluid-blokken", + "block-switching/@settings-select-customargsmode-all": "Argumenten in alle eigen blokken in sprite", + "block-switching/@settings-select-customargsmode-defOnly": "Argumenten in eigen eigen blok", + "load-extensions/@description": "Laat muziek, pen, en andere extensies automatisch zien in de blokcategoriemenu in de editor.", + "load-extensions/@name": "Extensies automatisch toevoegen", + "load-extensions/@settings-name-music": "Muziek", + "load-extensions/@settings-name-text2speech": "Tekst naar Spraak", + "load-extensions/@settings-name-translate": "Vertaal", + "custom-zoom/@description": "Kies zelf instellingen voor de minimale, maximale, snelheid, en beginzoom van de zoom van scripts in het codegebied, en verberg automatisch de knoppen.", + "custom-zoom/@name": "Aanpasbare codegebied-zoom", + "custom-zoom/@settings-name-autohide": "Zoomknoppen Automatisch Verbergen", + "custom-zoom/@settings-name-maxZoom": "Maximale Zoom (100-500%)", + "custom-zoom/@settings-name-minZoom": "Minimale Zoom (1-100%)", + "custom-zoom/@settings-name-speed": "Animatiesnelheid van Automatisch Verbergen", + "custom-zoom/@settings-name-startZoom": "Beginzoom (50-500%)", + "custom-zoom/@settings-name-zoomSpeed": "Zoomsnelheid (50-200%)", + "custom-zoom/@settings-select-speed-default": "Standaard", + "custom-zoom/@settings-select-speed-long": "Traag", + "custom-zoom/@settings-select-speed-none": "Meteen", + "custom-zoom/@settings-select-speed-short": "Vlug", + "initialise-sprite-position/@description": "Verander de standaard x/y-positie van nieuwe sprites.", + "initialise-sprite-position/@name": "Aanpasbare positie van nieuwe sprite", + "initialise-sprite-position/@settings-name-duplicate": "Gedrag van gedupliceerde sprites", + "initialise-sprite-position/@settings-name-library": "Geef bibliotheeksprites een willekeurige positie", + "initialise-sprite-position/@settings-name-x": "X-positie", + "initialise-sprite-position/@settings-name-y": "Y-positie", + "initialise-sprite-position/@settings-select-duplicate-custom": "Ga naar specifieke x/y-posities", + "initialise-sprite-position/@settings-select-duplicate-keep": "Hetzelfde als de originele sprite houden", + "initialise-sprite-position/@settings-select-duplicate-randomize": "Willekeurig", + "blocks2image/@description": "Gebruik de rechtermuisknop op het codegebied om blokken te exporteren als SVG/PNG-afbeeldingen.", + "blocks2image/@name": "Blokken opslaan als afbeelding", + "remove-curved-stage-border/@description": "Verwijdert de ronde rand rond het speelveld zodat je de hoeken beter kunt zien.", + "remove-curved-stage-border/@name": "Ronde speelveldrand verwijderen", + "transparent-orphans/@description": "Pas de doorzichtigheid aan voor blokken in de editor, met aparte opties voor losse blokken (blokken zonder gebeurtenis-blokken erboven) en blokken die worden gesleept.", + "transparent-orphans/@name": "Blokdoorzichtigheid", + "transparent-orphans/@settings-name-block": "Blokdoorzichtigheid (%)", + "transparent-orphans/@settings-name-dragged": "Gesleepte blokdoorzichtigheid (%)", + "transparent-orphans/@settings-name-orphan": "Losse blokdoorzichtigheid (%)", + "paint-by-default/@description": "Verandert de standaardactie van de \"Kies een Sprite/Uiterlijk/Achtergrond/Geluid\"-knoppen, die normaal de bibliotheek openen.", + "paint-by-default/@name": "Standaard sprite tekenen", + "paint-by-default/@settings-name-backdrop": "Achtergrond toevoegen", + "paint-by-default/@settings-name-costume": "Uiterlijk toevoegen", + "paint-by-default/@settings-name-sound": "Geluid toevoegen", + "paint-by-default/@settings-name-sprite": "Sprite toevoegen", + "paint-by-default/@settings-select-backdrop-library": "Bibliotheek", + "paint-by-default/@settings-select-backdrop-paint": "Teken", + "paint-by-default/@settings-select-backdrop-surprise": "Verrassing", + "paint-by-default/@settings-select-backdrop-upload": "Uploaden", + "paint-by-default/@settings-select-costume-library": "Bibliotheek", + "paint-by-default/@settings-select-costume-paint": "Teken", + "paint-by-default/@settings-select-costume-surprise": "Verrassing", + "paint-by-default/@settings-select-costume-upload": "Uploaden", + "paint-by-default/@settings-select-sound-library": "Bibliotheek", + "paint-by-default/@settings-select-sound-record": "Opnemen", + "paint-by-default/@settings-select-sound-surprise": "Verrassing", + "paint-by-default/@settings-select-sound-upload": "Uploaden", + "paint-by-default/@settings-select-sprite-library": "Bibliotheek", + "paint-by-default/@settings-select-sprite-paint": "Teken", + "paint-by-default/@settings-select-sprite-surprise": "Verrassing", + "paint-by-default/@settings-select-sprite-upload": "Uploaden", + "block-cherry-picking/@description": "Sleep een enkel blok uit een script met de Ctrl-toets (zonder dat alle blokken eronder ook meegaan).", + "block-cherry-picking/@info-flipControls": "Als \"besturing omdraaien\" aanstaat, is het enkele blokken uit een script slepen normaal. Houdt Ctrl ingedrukt om het hele script te slepen.", + "block-cherry-picking/@info-macContextDisabled": "Gebruik de Cmd-toets in plaats van Ctrl op macOS.", + "block-cherry-picking/@name": "Enkel blok slepen met Ctrl-toets", + "block-cherry-picking/@settings-name-invertDrag": "Besturing omdraaien", + "hide-new-variables/@description": "Geen monitors maken voor nieuwe variabelen of lijsten.", + "hide-new-variables/@name": "Nieuwe variabelen verbergen", + "editor-extra-keys/@description": "Voegt meer toetsen toe aan de \"toets () ingedrukt?\" en \"wanneer () is ingedrukt\" blokdropdowns, zoals enter, punt, komma, en meer. Deze toetsen werken zelfs voor gebruikers zonder deze addon.", + "editor-extra-keys/@info-experimentalKeysWarn": "De \"experimentele toetsen\" bevatten isteken, slash, puntkomma en meer. Dit werkt niet op alle systemen of toetsenborden.", + "editor-extra-keys/@info-shiftKeysWarn": "De \"Shifttoetsen\" bevatten toetsen die normaal de Shifttoets en een getaltoets, zoals hashtag, uitroepteken en meer. Deze toetsen werken alleen met de \"wanneer () is ingedrukt\"-blok en werken niet op alle systemen of toetsenborden.", + "editor-extra-keys/@name": "Meer toetsopties", + "editor-extra-keys/@settings-name-experimentalKeys": "Experimentele toetsen weergeven", + "editor-extra-keys/@settings-name-shiftKeys": "Shifttoetsen weergeven", + "hide-delete-button/@description": "Verbergt de verwijderknop (afvalbakpictogram) in sprites, uiterlijken en geluiden. Ze kunnen nog steeds worden verwijderd in het rechterklikmenu.", + "hide-delete-button/@name": "Verwijderknop verbergen", + "hide-delete-button/@settings-name-costumes": "Uiterlijken en achtergronden", + "hide-delete-button/@settings-name-sounds": "Geluiden", + "no-script-bumping/@description": "Laat je je scripts bewegen en veranderen zonder overlappende scripts te laten bewegen.", + "no-script-bumping/@name": "Overlappende scripts niet automatisch verplaatsen", + "disable-stage-drag-select/@description": "Maakt het niet meer mogelijk om sprites rond te slepen in de editor, behalve diegene die ingesteld zijn als sleepbaar. Houd Shift ingedrukt om sprites zoals normaal te slepen.", + "disable-stage-drag-select/@name": "Niet-sleepbare sprites in editor", + "move-to-top-bottom/@description": "Voegt opties toe in de rechterklikmenu's van uiterlijken of geluiden om ze helemaal boven of beneden in de lijst te plaatsen.", + "move-to-top-bottom/@info-developer-tools": "Deze addon maakte voorheen deel uit van de \"ontwikkelaarstools\"-addon maar is nu hierheen verhuisd.", + "move-to-top-bottom/@name": "Verplaats uiterlijk naar boven of beneden", + "disable-paste-offset/@description": "Plak gekopieerde items op hun originele plek in plaats van een beetje verplaatst in de uiterlijkeditor.", + "disable-paste-offset/@info-vanilla": "Dit kan ook gedaan worden zonder deze addon, namelijk door op het object te klikken met Alt ingedrukt.", + "disable-paste-offset/@name": "Geplakte items niet verplaatsen", + "block-duplicate/@description": "Dupliceer snel een script door het te slepen met de Alt-toets ingedrukt. Houd Ctrl ook ingedrukt om alleen een enkel blok te dupliceren in plaats van het hele script eronder.", + "block-duplicate/@info-mac": "Gebruik de Option-toets in plaats van de Alt-toets en de Command-toets in plaats van de Control-toets op macOS.", + "block-duplicate/@name": "Scripts dupliceren met de Alt-toets", + "rename-broadcasts/@description": "Verander de naam van signalen in de dropdowns van signaalblokken.", + "rename-broadcasts/@name": "Signalen hernoemen", + "swap-local-global/@description": "Geeft meer opties voor het hernoemen van variabelen of lijsten: laat je kiezen tussen \"Voor alle sprites\" en \"Alleen voor deze sprite\" en of variabelen voor de cloud moeten zijn. Voegt ook een optie toe voor rechterklikken op een variabele/lijst om snel zijn type te veranderen.", + "swap-local-global/@name": "Wissel variabelen tussen \"Voor alle sprites\" en \"Alleen voor deze sprite\"", + "editor-comment-previews/@description": "Geeft je de mogelijkheid om de inhoud van opmerkingen te zien door je muisaanwijzer over samengeklapte opmerkingen en blokken te zetten. Hiermee kun je opmerkingen zien die van het scherm af zijn, herhalingsblokken te onderscheiden vanaf de onderkant door zijn voorbeeld, veel grote opmerkingen in een kleine plek passen, en meer.", + "editor-comment-previews/@name": "Editoropmerkingvoorbeelden", + "editor-comment-previews/@settings-name-delay": "Uitstellengte", + "editor-comment-previews/@settings-name-follow-mouse": "Muisaanwijzer volgen", + "editor-comment-previews/@settings-name-hover-view": "Voorbeeld geven van samengeklapte opmerkingen", + "editor-comment-previews/@settings-name-hover-view-block": "Muisaanwijzer over blokken houden om bijbehorende opmerkingen te zien", + "editor-comment-previews/@settings-name-hover-view-procedure": "Muisaanwijzer over zelfgemaakte blokken houden om definitieopmerkingen te zien", + "editor-comment-previews/@settings-name-reduce-animation": "Animaties verminderen", + "editor-comment-previews/@settings-name-reduce-transparency": "Doorzichtigheid verminderen", + "editor-comment-previews/@settings-select-delay-long": "Lang", + "editor-comment-previews/@settings-select-delay-none": "Geen", + "editor-comment-previews/@settings-select-delay-short": "Kort", + "columns/@description": "Verdeelt het blokcategoriemenu in 2 kolommen en zet het boven het blokpalet, net zoals in Scratch 2.0.", + "columns/@name": "Categorie-menu met 2 kolommen", + "number-pad/@description": "Geef het getallenpaneel op alle apparaten weer tijdens het bewerken van een getalinvoer, in plaats van alleen op touchscreenapparaten.", + "number-pad/@info-explanation": "Een getallenpaneel komt tevoorschijn bij het bewerken van getalinvoeren van bepaalde blokken, zoals \"verander x met\".", + "number-pad/@name": "Getallenpaneel altijd weergeven", + "script-snap/@description": "Sleep een script om zijn positie automatisch uit te lijnen op de codegebied-stippen.", + "script-snap/@name": "Scripts uitlijnen op raster", + "script-snap/@preset-name-default": "Standaard", + "script-snap/@preset-name-half-block": "Half blok", + "script-snap/@preset-name-whole-block": "Heel blok", + "script-snap/@settings-name-grid": "Rastergrootte (px)", + "fullscreen/@description": "Lost een paar ongewenste dingen op in de volledig scherm-modus van de projectspeler, opent het in je browser's volledig scherm-modus, en verbergt de werkbalk met de groene vlag.", + "fullscreen/@info-hideToolbarNotice": "Als je de werkbalk verbergt, onthoud dan dat je Esc kan gebruiken om het volledige scherm uit te gaan.", + "fullscreen/@name": "Verbeterd volledig scherm", + "fullscreen/@settings-name-browserFullscreen": "Volledig scherm projectspeler openen in browser-volledig scherm", + "fullscreen/@settings-name-hideToolbar": "Werkbalk verbergen in volledig scherm", + "hide-stage/@description": "Voegt een knop naast de knoppen \"speelveld verkleinen\" en \"speelveld vergroten\" toe die het speelveld en spritevenster verbergt, wat het codegebied veel groter maakt.", + "hide-stage/@name": "Speelveld en spritevenster verbergen", + "editor-stepping/@description": "Voegt een gekleurde markering toe aan de blokken die op dit moment worden uitgevoerd in een project.", + "editor-stepping/@name": "Rand om uitvoerende blokken", + "editor-stepping/@settings-name-highlight-color": "Markeringskleur" +} \ No newline at end of file diff --git a/src/addons/addons-l10n-settings/pl.json b/src/addons/addons-l10n-settings/pl.json new file mode 100644 index 0000000000000000000000000000000000000000..0e3a76eb1062ea381343b95005af3f454c346e91 --- /dev/null +++ b/src/addons/addons-l10n-settings/pl.json @@ -0,0 +1,316 @@ +{ + "cat-blocks/@description": "Przywraca do edytora kocie bloki z prima aprilis 2020.", + "cat-blocks/@name": "Kocie Bloki", + "cat-blocks/@settings-name-watch": "Patrz na kursor myszy", + "editor-devtools/@name": "Narzędzia Developerskie", + "editor-devtools/@settings-name-enableCleanUpPlus": "Ulepszone „Wyczyść bloki”", + "editor-devtools/@settings-name-enablePasteBlocksAtMouse": "Wklej bloki w miejscu kursora myszy", + "find-bar/@info-developer-tools": "Ten dodatek był wcześniej częścią dodatku „narzędzia developerskie”, ale został przeniesiony tutaj.", + "middle-click-popup/@info-developer-tools": "Ten dodatek był wcześniej częścią dodatku „narzędzia developerskie”, ale został przeniesiony tutaj.", + "middle-click-popup/@name": "Wstaw bloki według nazwy", + "jump-to-def/@name": "Przejdź do definicji bloku", + "editor-searchable-dropdowns/@description": "Umożliwia wyszukiwanie zawartości list rozwijanych należących do bloków. ", + "editor-searchable-dropdowns/@name": "Możliwość szukania w liście", + "data-category-tweaks-v2/@description": "Zapewnia poprawki dla kategorii bloków Dane („Zmienne”). ", + "data-category-tweaks-v2/@name": "Ulepszenia kategorii danych", + "data-category-tweaks-v2/@settings-name-moveReportersDown": "Przesuwa bloki danych nad listę zmiennych", + "data-category-tweaks-v2/@settings-name-separateListCategory": "Oddziel kategorię Listy", + "data-category-tweaks-v2/@settings-name-separateLocalVariables": "Rozdziel zmienne \"Tylko dla tego duszka\"", + "block-palette-icons/@description": "Dodaje ikony wewnątrz kolorowych okręgów, które identyfikują kategorie bloków.", + "block-palette-icons/@name": "Ikony kategorii w edytorze", + "hide-flyout/@description": "Ukrywa paletę bloków, jeśli na nią nie najedziesz myszką. Kliknij ikonę kłódki, aby tymczasowo zablokować ją w miejscu. Możesz także użyć trybu „kliknięcie kategorii”.", + "hide-flyout/@info-hoverExplanation": "Tryb „Wyświetl, gdy najedziesz na listę bloków” tylko rozszerza obszar wyświetlania. Jeśli chcesz mieć możliwość przeciągania bloków do tego obszaru bez ich usuwania w koszu, użyj jednego z pozostałych trybów.", + "hide-flyout/@name": "Automatycznie chowana lista bloków", + "hide-flyout/@settings-name-speed": "Prędkość animacji", + "hide-flyout/@settings-name-toggle": "Wyświetl, gdy...", + "hide-flyout/@settings-select-speed-default": "Normalny", + "hide-flyout/@settings-select-speed-long": "Wolna", + "hide-flyout/@settings-select-speed-short": "Szybka", + "hide-flyout/@settings-select-toggle-category": "Klikniesz na kategorię", + "hide-flyout/@settings-select-toggle-cathover": "Najedziesz na kategorie", + "hide-flyout/@settings-select-toggle-hover": "Najedziesz na listę bloków", + "hide-flyout/@update": "Kod tego dodatku został całkiem zmieniony, oraz wiele błędów zostało naprawionych.", + "mediarecorder/@description": "Dodaje przycisk \"Włącz nagrywania\" w panelu pozwalający nagrać scenę.", + "mediarecorder/@name": "Nagrywanie Video z projektu", + "drag-drop/@description": "Pozwala przesuwać obrazy i dźwięki z Twojego managera plików do miejsca docelowego jak: lista duszków/kostiumów/dźwięków. W dodatku możesz przesuwać pliki tekstowe do pola \"Zapytaj i czekaj.\"", + "drag-drop/@name": "Przeciągnij i upuść pliki", + "drag-drop/@settings-name-use-hd-upload": "Użyj przesyłania HD", + "debugger/@settings-name-log_broadcasts": "Loguj ogłoszenia", + "debugger/@settings-name-log_clear_greenflag": "Wyczyść logi, kiedy projekt wystartuje", + "debugger/@settings-name-log_clone_create": "Loguj stworzenie klona", + "debugger/@settings-name-log_failed_clone_creation": "Loguj, kiedy ilość klonów osiągnie maksymalną wartość", + "debugger/@settings-name-log_greenflag": "Loguj kiedy kliknięto w Zieloną Flagę", + "debugger/@update": "Nowe zakładki „Wątki” i „Wydajność” w oknie debugera. ", + "pause/@description": "Dodaje przycisk pauzy obok zielonej flagi", + "pause/@name": "Przycisk pauzy", + "mute-project/@description": "Kliknij na zieloną flagę trzymając Ctr, aby wyciszyć lub od-ciszyć projekt.", + "mute-project/@info-macOS": "W systemie macOS, użyj klawiszu Cmd zamiast Ctrl.", + "mute-project/@name": "Wycisz odtwarzacz projektu", + "vol-slider/@name": "Suwak głośności projektu", + "vol-slider/@settings-name-defVol": "Domyślna głośność", + "clones/@description": "Dodaje licznik nad sceną pokazujący ilość klonów.", + "clones/@name": "Licznik klonów", + "clones/@settings-name-showicononly": "Pokaż tylko ikonę", + "mouse-pos/@description": "Wyświetla pozycję x/y twojej myszy nad sceną w edytorze.", + "mouse-pos/@name": "Pozycja kursora", + "color-picker/@description": "Dodaje opcję koloru hex do menu wyboru kolorów.", + "color-picker/@name": "Wybieracz koloru hex", + "remove-sprite-confirm/@description": "Upewnia się, czy na pewno chcesz usunąć duszka w projekcie.", + "remove-sprite-confirm/@name": "Potwierdzenie usunięcia duszka", + "block-count/@description": "Pokazuje ilość bloków użytych w edytorze. Wcześniej część dodatku \"Sprite and script count\".", + "block-count/@name": "Liczba bloków", + "onion-skinning/@description": "Pokazuje przezroczyste nakładki poprzednich lub następnych kostiumów podczas edycji kostiumu. Aby zmienić klatkę kliknij w przyciski pod ikonami powiększania kostiumu. Służy do łatwego tworzenia animacji.", + "onion-skinning/@settings-name-afterTint": "Odcień następnego kostiumu", + "onion-skinning/@settings-name-beforeTint": "Odcień poprzedniego kostiumu", + "onion-skinning/@settings-name-default": "Włączone domyślnie", + "onion-skinning/@settings-name-layering": "Domyślne warstwowanie", + "onion-skinning/@settings-name-mode": "Tryb domyślny", + "onion-skinning/@settings-name-next": "Domyślnie następne kostiumy", + "onion-skinning/@settings-name-opacity": "Nieprzezroczystość (%)", + "onion-skinning/@settings-name-opacityStep": "Nieprzezroczystość następnych kostiumów (%)", + "onion-skinning/@settings-name-previous": "Domyślnie poprzednie kostiumy", + "onion-skinning/@settings-select-layering-behind": "Tył", + "onion-skinning/@settings-select-layering-front": "Przód", + "onion-skinning/@settings-select-mode-merge": "Łącz obrazy", + "onion-skinning/@settings-select-mode-tint": "Kolor odcienia", + "paint-snap/@name": "Przyczepianie kostiumów w edytorze", + "paint-snap/@settings-name-enable-default": "Włącz domyślnie", + "paint-snap/@settings-name-guide-color": "Kolor zaznaczenia przyciąganych obiektów", + "paint-snap/@settings-name-objectCenters": "Przyczep do środka obiektów", + "paint-snap/@settings-name-objectCorners": "Przyczep do rogów obiektów", + "paint-snap/@settings-name-objectEdges": "Przyczep do boków obiektów", + "paint-snap/@settings-name-objectMidlines": "Przyczep do linii środkowych obiektów", + "paint-snap/@settings-name-pageAxes": "Przyczep do osi X i Y", + "paint-snap/@settings-name-pageCenter": "Przyczep do środka strony", + "paint-snap/@settings-name-pageCorners": "Przyczep do rogów strony", + "paint-snap/@settings-name-pageEdges": "Przyczep do boków strony", + "paint-snap/@settings-name-threshold": "Dystans przyczepiania", + "default-costume-editor-color/@description": "Zmienia domyślne parametry narzędzi w edytorze kostiumów.", + "default-costume-editor-color/@name": "Domyślne kolory w edytorze kostiumów", + "default-costume-editor-color/@settings-name-fill": "Domyślny kolor wypełnienia", + "default-costume-editor-color/@settings-name-stroke": "Domyślny kolor zarysu", + "default-costume-editor-color/@settings-name-strokeSize": "Domyślna wielkość zarysu", + "bitmap-copy/@description": "Pozwala ci kopiować zdjęcie z edytora kostiumu do schowka w systemie, abyś mógł wkleić do innych programów.", + "bitmap-copy/@info-norightclick": "„Kliknięcie prawym przyciskiem myszy → kopiowanie” nie jest obsługiwane. Musisz nacisnąć Ctrl + C, gdy wybrany jest obraz bitmapowy.", + "bitmap-copy/@name": "Kopiowanie obrazów bitmapowych", + "2d-color-picker/@description": "Zamienia paski wyboru jasności i saturacji, na paletę kolorów 2D w edytorze kostiumów. Przytrzymaj Shift, aby zmieniać wartość na tylko jednej płaszczyźnie.", + "2d-color-picker/@name": "Wybieranie kolorów w 2D", + "better-img-uploads/@description": "Dodaje nowy przycisk, który automatycznie zamienia przesłane obrazy bitmapowe na obrazy SVG (wektorowe), aby uniknąć utraty jakości.", + "better-img-uploads/@info-notSuitableEdit": "Unikaj używania przycisku przesyłania HD, jeśli planujesz edytować obraz po przesłaniu.", + "better-img-uploads/@name": "Przesyłanie obrazów HD ", + "better-img-uploads/@settings-name-fitting": "Zmienianie rozmiaru obrazu", + "better-img-uploads/@settings-select-fitting-fill": "Zwiększ, aby wypełnić scenę ", + "better-img-uploads/@settings-select-fitting-fit": "Zmniejsz, aby dopasować do sceny", + "better-img-uploads/@settings-select-fitting-full": "Oryginalny rozmiar", + "custom-block-shape/@description": "Dostosuj wielkość obramowania, zaokrąglenia rogów i wysokości bloków.", + "custom-block-shape/@info-paddingWarning": "Zmniejszanie wielkości obramowania jest widoczne tylko dla Ciebie, więc gdy Twoje projekty zostaną wyświetlone przez inne Twój kod może nachodzić na siebie.", + "custom-block-shape/@name": "Dowolny kształt bloków", + "custom-block-shape/@preset-description-default2": "Wygląd podobny do bloków Scratch 2.0 ", + "custom-block-shape/@preset-description-default3": "Regularny wygląd bloków Scratch 3.0", + "custom-block-shape/@preset-description-flat2": "Bloki Scratch 2.0 z usuniętymi nacięciami i narożnikami ", + "custom-block-shape/@preset-description-flat3": "Bloki Scratch 3.0 z usuniętymi nacięciami i narożnikami ", + "custom-block-shape/@preset-name-default2": "Bloki 2.0", + "custom-block-shape/@preset-name-default3": "Bloki 3.0", + "custom-block-shape/@preset-name-flat2": "Płaskie 2.0", + "custom-block-shape/@preset-name-flat3": "Płaskie 3.0", + "custom-block-shape/@settings-name-cornerSize": "Rozmiar zaokrąglenia rogów (0--300%)", + "custom-block-shape/@settings-name-notchSize": "Wielkość nacięcia (0-150%) ", + "custom-block-shape/@settings-name-paddingSize": "Rozmiar obramowania (50-200%)", + "zebra-striping/@settings-name-intensity": "Intensywność (0-100%)", + "zebra-striping/@settings-name-shade": "Cień", + "zebra-striping/@settings-select-shade-darker": "Ciemniej", + "zebra-striping/@settings-select-shade-lighter": "Jaśniej", + "editor-theme3/@description": "Edytuj kolory bloków dla każdej kategorii w edytorze.", + "editor-theme3/@name": "Niestandardowe kolory bloków", + "editor-theme3/@preset-description-black": "Zmienia tło bloków na czarne", + "editor-theme3/@preset-description-dark": "Ciemne wersje podstawowych kolorów", + "editor-theme3/@preset-description-original": "Oryginalne kolory bloków z wersji Scratch 2.0", + "editor-theme3/@preset-description-tweaks": "Kategorie \"zdarzenia\", \"kontrola\", i \"moje bloki\" są kolorach z wersji 2.0", + "editor-theme3/@preset-name-black": "Czarny", + "editor-theme3/@preset-name-dark": "Ciemny", + "editor-theme3/@preset-name-original": "Kolory 2.0", + "editor-theme3/@preset-name-tweaks": "Poprawki 3.0 ", + "editor-theme3/@settings-name-Pen-color": "rozszerzenia", + "editor-theme3/@settings-name-comment-color": "Komentarze", + "editor-theme3/@settings-name-control-color": "kontrola", + "editor-theme3/@settings-name-custom-color": "niestandardowy", + "editor-theme3/@settings-name-data-color": "zmienne", + "editor-theme3/@settings-name-data-lists-color": "listy", + "editor-theme3/@settings-name-events-color": "zdarzenia", + "editor-theme3/@settings-name-input-color": "Wejścia bloków", + "editor-theme3/@settings-name-looks-color": "wygląd", + "editor-theme3/@settings-name-motion-color": "ruch", + "editor-theme3/@settings-name-operators-color": "wyrażenia", + "editor-theme3/@settings-name-sensing-color": "czujniki", + "editor-theme3/@settings-name-sounds-color": "dźwięk", + "editor-theme3/@settings-name-text": "Kolor tekstu", + "editor-theme3/@settings-select-text-black": "Czarny", + "editor-theme3/@settings-select-text-colorOnBlack": "Kolorowe na czarnym tle", + "editor-theme3/@settings-select-text-colorOnWhite": "Kolorowe na białym tle", + "editor-theme3/@settings-select-text-white": "Biały", + "editor-theme3/@update": "Ustawienie \"Ciemne komentarze\" z sekcji \"Tryb ciemny edytora i niestandardowe kolory\" zostało przeniesione tutaj i jest teraz dostosowywalne.", + "custom-block-text/@description": "Zmienia nasycenie tekstu na blokach, opcjonalnie dodaje cień obok nich.", + "custom-block-text/@name": "Konfigurowalny styl tekstu bloków", + "custom-block-text/@settings-name-bold": "Pogrubiony tekst", + "custom-block-text/@settings-name-shadow": "Cień pod tekstem", + "editor-colored-context-menus/@description": "Kiedy klikniesz prawym klawiszem na blok, wyświetlone menu ma kolorowe tło.", + "editor-colored-context-menus/@name": "Kolorowe menu zawartości", + "editor-stage-left/@description": "Przesuwa scenę i listę duszków na lewą stronę edytora, jak w Scratch 2.0.", + "editor-stage-left/@info-reverseOrder": "Aby zmienić kolejność przycisków powyżej sceny, użyj dodatku \"Odwrócona kolejność kontrolek projektu\".", + "editor-stage-left/@name": "Przenieś scenę na lewą stronę", + "editor-buttons-reverse-order/@description": "Przesuwa zieloną flagę oraz przyciski do zatrzymania na prawą stronę, a przycisk powiększenia ekranu na lewą stronę, tak samo jak w Scratch 2.0.", + "editor-buttons-reverse-order/@name": "Odwrócona kolejność kontrolek projektu", + "variable-manager/@description": "Dodaje nową zakładkę obok \"dźwięków\" w edytorze, aby łatwo edytować zmienne i listy.", + "variable-manager/@name": "Menedżer zmiennych", + "search-sprites/@description": "Dodaje pole wyszukiwania w liście duszków, za pomocą którego możesz wyszukać duszka po jego nazwie.", + "search-sprites/@name": "Szukaj duszków po nazwie", + "sprite-properties/@settings-name-transitionDuration": "Prędkość animacji", + "sprite-properties/@settings-select-transitionDuration-default": "Domyślna", + "sprite-properties/@settings-select-transitionDuration-long": "Wolna", + "sprite-properties/@settings-select-transitionDuration-none": "Od razu", + "sprite-properties/@settings-select-transitionDuration-short": "Szybka", + "gamepad/@description": "Kontroluj projekt za pomocą kontrolera/gamepada używając USB lub Bluetooth.", + "gamepad/@name": "Wsparcie dla Gamepadów", + "gamepad/@settings-name-hide": "Ukryj przycisk ustawień, gdy system nie wykryje żadnych kontrolerów ", + "editor-sounds/@description": "Pusza efekty dźwiękowe, kiedy połączysz lub rozłączysz bloki.", + "editor-sounds/@name": "Efekty dźwiękowe w edytorze", + "folders/@description": "Dodaje foldery do panelu duszków, a także do listy kostiumów i dźwięków. Aby utworzyć folder, kliknij prawym przyciskiem myszy na dowolnego duszka i wybierz opcję \"utwórz folder\". Kliknij folder, aby go otworzyć lub zamknąć. Naciśnij prawym przycisk myszy na duszku, aby zobaczyć, do jakich folderów możesz go przenieść. Możesz także przeciągnąć go i upuść go do dowolnego otwartego folderu. Ta funkcja działa poprzez dodanie „[nazwa_folderu]//” na początku nazw twoich duszków.", + "folders/@info-notice-folders-are-public": "Użytkownicy, którzy mają włączoną tą funkcję będą widzieć foldery w Twoim projekcie. A inne osoby, będą normalnie widzieć listę duszków (bez folderów).", + "folders/@name": "Foldery duszków", + "block-switching/@description": "Kliknij prawym przyciskiem myszy na blok, aby zamienić go na powiązany blok.", + "block-switching/@name": "Zmiana bloków", + "block-switching/@settings-name-control": "Bloki kontroli", + "block-switching/@settings-name-customargs": "Argumenty Moich Bloków", + "block-switching/@settings-name-customargsmode": "Pokaż argumenty Moich Bloków", + "block-switching/@settings-name-data": "Bloki danych", + "block-switching/@settings-name-event": "Bloki zdarzeń", + "block-switching/@settings-name-extension": "Bloki rozszerzeń", + "block-switching/@settings-name-looks": "Bloki wyglądu", + "block-switching/@settings-name-motion": "Bloki ruchu", + "block-switching/@settings-name-noop": "Pokaż opcję do zmieniania bloku", + "block-switching/@settings-name-operator": "Bloki operatora", + "block-switching/@settings-name-sensing": "Bloki czujników", + "block-switching/@settings-name-sound": "Bloki dźwięku", + "block-switching/@settings-select-customargsmode-all": "Argumenty we wszystkich Moich Blokach w duszku", + "block-switching/@settings-select-customargsmode-defOnly": "Argumenty w Moich Blokach", + "load-extensions/@description": "Automatycznie pokazuje bloki muzyczne, pióro i inne rozszerzenia do Twojego projektu.", + "load-extensions/@name": "Automatycznie dodawaj rozszerzenia", + "load-extensions/@settings-name-music": "Muzyka", + "load-extensions/@settings-name-pen": "Pióro", + "load-extensions/@settings-name-text2speech": "Tekst na mowę", + "load-extensions/@settings-name-translate": "Tłumacz", + "custom-zoom/@description": "Wybierz niestandardowe ustawienia dla minimalnej i maksymalnej wielkości, szybkości, oraz dla początkowego rozmiaru powiększenia skryptów w obszarze kodu.", + "custom-zoom/@name": "Dowolne powiększenie obszaru kodu", + "custom-zoom/@settings-name-autohide": "Automatycznie ukrywaj kontrolki przybliżania", + "custom-zoom/@settings-name-maxZoom": "Maksymalne Powiększenie (100-500%)", + "custom-zoom/@settings-name-minZoom": "Minimalne przybliżenie (1-100%)", + "custom-zoom/@settings-name-speed": "Prędkość animacji autochowania", + "custom-zoom/@settings-name-startZoom": "Początkowe przybliżenie (50-500%)", + "custom-zoom/@settings-name-zoomSpeed": "Prędkość przybliżania (50-200%)", + "custom-zoom/@settings-select-speed-default": "Domyślny", + "custom-zoom/@settings-select-speed-long": "Wolna", + "custom-zoom/@settings-select-speed-short": "Szybka", + "initialise-sprite-position/@description": "Zmień domyślną pozycję x i y dla nowych duszków.", + "initialise-sprite-position/@name": "Dowolna pozycja nowych duszków", + "initialise-sprite-position/@settings-name-duplicate": "Zachowanie podczas duplikowania duszków", + "initialise-sprite-position/@settings-name-library": "Losuj pozycję duszków w bibliotece", + "initialise-sprite-position/@settings-name-x": "pozycja X", + "initialise-sprite-position/@settings-name-y": "pozycja Y", + "initialise-sprite-position/@settings-select-duplicate-custom": "Pójdź na konkretną pozycje x/y", + "initialise-sprite-position/@settings-select-duplicate-keep": "Zostań w tej samej pozycji co oryginalny duszek", + "initialise-sprite-position/@settings-select-duplicate-randomize": "Pójdź na losową pozycję", + "blocks2image/@description": "Kliknij prawym klawiszem w edytorze kodu, aby wyeksportować bloki jako obrazy SVG/PNG.", + "blocks2image/@name": "Zapisz bloki jako obraz", + "remove-curved-stage-border/@description": "Usuwa zaokrąglone krawędzie sceny, i pozwala zobaczyć jej rogi.", + "remove-curved-stage-border/@name": "Usuwa zaokrąglone krawędzie w podglądzie projektu", + "transparent-orphans/@description": "Dostosuj przezroczystość bloków w edytorze, korzystając z osobnych opcji dla bloków odłączonych (tych bez nagłówka) i bloków przeciąganych.", + "transparent-orphans/@name": "Przezroczystość bloku", + "transparent-orphans/@settings-name-block": "Przezroczystość bloku (%)", + "transparent-orphans/@settings-name-dragged": "Przezroczystość przeciąganych bloków (%)", + "transparent-orphans/@settings-name-orphan": "Przezroczystość odłączonych bloków (%)", + "paint-by-default/@description": "Zmienia domyślną akcję przycisków „Wybierz duszka/kostium/tło/dźwięk”, które domyślnie otwierają bibliotekę. ", + "paint-by-default/@name": "Domyślnie koloruj kostium", + "paint-by-default/@settings-name-backdrop": "Wybierz tło", + "paint-by-default/@settings-name-costume": "Wybierz kostium", + "paint-by-default/@settings-name-sound": "Wybierz dźwięk", + "paint-by-default/@settings-name-sprite": "Wybierz duszka", + "paint-by-default/@settings-select-backdrop-library": "Biblioteka", + "paint-by-default/@settings-select-backdrop-paint": "Maluj", + "paint-by-default/@settings-select-backdrop-surprise": "Niespodzianka", + "paint-by-default/@settings-select-backdrop-upload": "Prześlij", + "paint-by-default/@settings-select-costume-library": "Biblioteka", + "paint-by-default/@settings-select-costume-paint": "Maluj", + "paint-by-default/@settings-select-costume-surprise": "Niespodzianka", + "paint-by-default/@settings-select-costume-upload": "Prześlij", + "paint-by-default/@settings-select-sound-library": "Biblioteka", + "paint-by-default/@settings-select-sound-record": "Nagraj", + "paint-by-default/@settings-select-sound-surprise": "Niespodzianka", + "paint-by-default/@settings-select-sound-upload": "Prześlij", + "paint-by-default/@settings-select-sprite-library": "Biblioteka", + "paint-by-default/@settings-select-sprite-paint": "Maluj", + "paint-by-default/@settings-select-sprite-surprise": "Niespodzianka", + "paint-by-default/@settings-select-sprite-upload": "Wczytaj duszka", + "block-cherry-picking/@description": "Daje możliwość do wyciągnięcia jednego bloku z środku kodu (zamiast wyciągania wszystkich poniżej). Aby to zrobić należy kliknąć trzymając klawisz Ctr.", + "block-cherry-picking/@info-flipControls": "Jeśli ustawienie \"odwróć działanie\" jest włączone, to chwytanie bloków pojedynczo będzie zachowaniem domyślnym. Przytrzymaj Ctrl, aby przeciągnąć cały stos. ", + "block-cherry-picking/@info-macContextDisabled": "W systemie macOS zamiast klawisza Ctrl, należy użyć klawisza Cmd.", + "block-cherry-picking/@name": "Złap pojedynczy blok klawiszem Ctrl", + "block-cherry-picking/@settings-name-invertDrag": "Odwróć działanie", + "hide-new-variables/@description": "Po stworzeniu listy lub zmiennej nie pokazuj jej podglądu.", + "hide-new-variables/@name": "Ukryj nowo stworzone zmienne", + "editor-extra-keys/@info-experimentalKeysWarn": "Dodaje \"eksperymentalne klawisze\" wliczając \"znak równości\", \"slash\" i więcej! Może nie działać na wszystkich systemach operacyjnych lub na innych ułożeniach klawiatur!", + "editor-extra-keys/@info-shiftKeysWarn": "„Klawisze Shift” obejmują klawisze, które zwykle wymagają klawisza Shift i klawisza numerycznego, takie jak \"hashtag\", \"wykrzyknik\" i inne. Te klawisze działają tylko z blokiem „kiedy naciśnięto klawisz ()” i nie działają we wszystkich systemach operacyjnych lub innych układach klawiatury. ", + "editor-extra-keys/@settings-name-experimentalKeys": "Pokaż klawisze eksperymentalne", + "hide-delete-button/@description": "Ukrywa przycisk usuwania (ikonę kosza na śmieci) przed duszkami, kostiumami i dźwiękami. Nadal można je usunąć za pomocą prawego przycisku myszy.", + "hide-delete-button/@name": "Ukryj przycisk usuwania", + "hide-delete-button/@settings-name-costumes": "Kostiumy i tła", + "hide-delete-button/@settings-name-sounds": "Dźwięki", + "hide-delete-button/@settings-name-sprites": "Duszki", + "no-script-bumping/@description": "Kiedy zasłonisz inny kod, to wtedy on się nie przesunie, tylko zostanie w tej samej pozycji.", + "no-script-bumping/@name": "Wyłącz automatyczne przesuwanie nakładających się skryptów", + "disable-stage-drag-select/@description": "Blokuje możliwość przesuwania duszków na scenie w edytorze projektu, z wyjątkiem tych, które są ustawione na \"przesuwalne\". Przytrzymać Shift, aby normalnie przesuwać duszki.", + "disable-stage-drag-select/@name": "Blokada przesuwania duszków w edytorze", + "move-to-top-bottom/@info-developer-tools": "Ten dodatek był wcześniej częścią dodatku „narzędzia developerskie”, ale został przeniesiony tutaj.", + "move-to-top-bottom/@name": "Przenieś kostium do góry albo do dołu", + "disable-paste-offset/@description": "Wklej skopiowane kostiumy w jej oryginalnej pozycji, zamiast delikatnie je przesuwać.", + "disable-paste-offset/@name": "Nie przesuwaj wklejonych obiektów", + "block-duplicate/@description": "Szybko zduplikuj skrypt, przeciągając go, trzymając klawisz Alt. Możesz także przytrzymać również klawisz Ctrl, aby zduplikować tylko pojedynczy blok zamiast całego stosu dołączonego pod nim.", + "block-duplicate/@info-mac": "W systemie macOS zamiast klawisza Alt należy użyć klawisza Option, a zamiast klawisza Control - klawisza Command.", + "block-duplicate/@name": "Duplikuj skrypt przyciskiem Alt", + "rename-broadcasts/@description": "Dodaje możliwość zmiany nazwy komunikatów w blokach nadawczych.", + "rename-broadcasts/@name": "Zmień ogłoszenie", + "swap-local-global/@description": "Dodaje więcej opcji w czasie zmieniania nazwy zmiennej lub listy. Możesz zmienić czy dana zmienna jest dla \"Wszystkich duszków\" lub \"Tylko dla tego duszka\" oraz czy jest zapisywana w chmurze.", + "swap-local-global/@name": "Przełącz zmienną między ustawieniami \"Dla wszystkich duszków\" na \"Tylko dla tego duszka\"", + "editor-comment-previews/@description": "Pozwala podejrzeć zawartość komentarza najeżdżając na połączone bloki. Możesz nawet zobaczyć komentarze, które zachodzą za ekran. Dodatkowo możesz zmieścić duże komentarze w małej przestrzeni oraz więcej!", + "editor-comment-previews/@name": "Podgląd komentarzy", + "editor-comment-previews/@settings-name-delay": "Czas opóźnienia", + "editor-comment-previews/@settings-name-follow-mouse": "Podążaj za myszą", + "editor-comment-previews/@settings-name-hover-view": "Najedź na nakładające się komentarze, aby zobaczyć ich podgląd.", + "editor-comment-previews/@settings-name-hover-view-block": "Najedź na bloki, aby poznać ich definicje i komentarze.", + "editor-comment-previews/@settings-name-hover-view-procedure": "Najedź na \"moje bloki\", aby poznać ich definicje i komentarze.", + "editor-comment-previews/@settings-name-reduce-animation": "Zmniejsz ilość animacji", + "editor-comment-previews/@settings-name-reduce-transparency": "Zmniejsz przezroczystość", + "editor-comment-previews/@settings-select-delay-long": "Długie", + "editor-comment-previews/@settings-select-delay-none": "Brak", + "editor-comment-previews/@settings-select-delay-short": "Krótkie", + "columns/@description": "Dzieli menu kategorii bloków na dwie kolumny i przenosi je na górę palety bloków, tak jak w Scratch 2.0.", + "columns/@name": "Menu kategorii podzielone na 2 kolumny", + "number-pad/@description": "Pokazuje klawiaturę numeryczną Scratcha podczas edycji pól liczbowych na wszystkich urządzeniach, a nie tylko na urządzeniach z ekranem dotykowym.", + "number-pad/@info-explanation": "Podczas edycji liczb w niektórych blokach, takich jak \"ustaw x na\", pojawi się klawiatura numeryczna.", + "number-pad/@name": "Zawsze pokazuj klawiaturę numeryczną", + "script-snap/@description": "Po przesunięciu kodu, zostanie on \"przyczepiony\" do kropek tła w edytorze.", + "script-snap/@name": "Przyczep fragmenty kodu do wirtualnej siatki", + "script-snap/@preset-name-default": "Domyślny", + "script-snap/@preset-name-half-block": "Połowa bloku", + "script-snap/@preset-name-whole-block": "Cały blok kodu", + "script-snap/@settings-name-grid": "Wielkość siatki (px)", + "fullscreen/@description": "Naprawia niektóre niepożądane efekty w trybie pełnoekranowym. Otwiera projekt w trybie pełnoekranowym przeglądarki oraz ukrywa pasek z zieloną flagą.", + "fullscreen/@info-hideToolbarNotice": "Jeśli zdecydujesz się ukryć pasek narzędzi, pamiętaj, że możesz użyć klawisza Esc, aby wyjść z trybu pełnoekranowego do odtwarzacza projektów. ", + "fullscreen/@name": "Polepszony pełny ekran", + "fullscreen/@settings-name-browserFullscreen": "Otwórz pełny ekran, gdy użytkownik jest w trybie pełnoekranowym przeglądarki", + "fullscreen/@settings-name-hideToolbar": "Ukryj pasek narzędzi w pełnym ekranie", + "hide-stage/@description": "Dodaje przycisk obok przycisków \"zmniejsz/zwiększ scenę\", który ukrywa scenę i listę duszków,znacznie zwiększając obszar kodowania.", + "hide-stage/@name": "Ukryj scenę i listę duszków", + "editor-stepping/@description": "Dodaje kolorowe podkreślenie do bloków, których kod wykonuje się w danym momencie.", + "editor-stepping/@name": "Obramowanie wykonujących się bloków", + "editor-stepping/@settings-name-highlight-color": "Kolor podkreślenia" +} \ No newline at end of file diff --git a/src/addons/addons-l10n-settings/pt.json b/src/addons/addons-l10n-settings/pt.json new file mode 100644 index 0000000000000000000000000000000000000000..6e852c745f0cbd6db3b32aa56537430d4f107ed9 --- /dev/null +++ b/src/addons/addons-l10n-settings/pt.json @@ -0,0 +1,281 @@ +{ + "cat-blocks/@description": "Adiciona de volta os blocos de gato no editor de primeiro de abril de 2020.", + "cat-blocks/@name": "Blocos de gato", + "cat-blocks/@settings-name-watch": "Monitorar ponteiro do mouse", + "editor-devtools/@name": "Ferramentas de desenvolvedor", + "editor-devtools/@settings-name-enableCleanUpPlus": "Melhorar opção \"Limpar Blocos\"", + "editor-devtools/@settings-name-enablePasteBlocksAtMouse": "Colar blocos na posição do mouse", + "find-bar/@name": "Barra localizar do editor", + "editor-searchable-dropdowns/@description": "Te deixa pesquisar nos dropdowns de blocos.", + "editor-searchable-dropdowns/@name": "Dropdowns buscáveis", + "data-category-tweaks-v2/@description": "Adiciona melhorias na categoria de Dados (\"Variáveis\").", + "data-category-tweaks-v2/@name": "Melhorias na categoria Dados", + "data-category-tweaks-v2/@settings-name-moveReportersDown": "Mover blocos de variáveis acima da lista de variáveis", + "data-category-tweaks-v2/@settings-name-separateListCategory": "Nova Categoria para Listas", + "data-category-tweaks-v2/@settings-name-separateLocalVariables": "Nova Categoria para Variáveis Apenas para este Ator", + "block-palette-icons/@description": "Adiciona ícones dentro dos círculos coloridos nas categorias de bloco.", + "block-palette-icons/@name": "Ícones nas categorias da paleta de blocos", + "hide-flyout/@description": "Esconde a paleta de blocos se o mouse não estiver em cima. Clique no ícone do cadeado para trancá-la temporariamente. Você também pode usar o modo \"ao clicar em uma categoria\".", + "hide-flyout/@info-hoverExplanation": "O modo \"Passar o mouse na área da paleta\" só aumenta a área visível. Se você quer poder arrastar blocos até aquela área sem jogar eles fora, use outro modo.", + "hide-flyout/@name": "Auto-esconder paleta de blocos", + "hide-flyout/@settings-name-toggle": "Alternar ao...", + "hide-flyout/@settings-select-speed-default": "Padrão", + "hide-flyout/@settings-select-toggle-category": "Clicar em uma categoria", + "hide-flyout/@settings-select-toggle-cathover": "Passar o mouse em uma categoria", + "hide-flyout/@settings-select-toggle-hover": "Passar o mouse na área da paleta", + "hide-flyout/@update": "Este addon foi revisado e diversos bugs foram corrigidos.", + "mediarecorder/@description": "Adiciona um botão \"começar a gravar\" à barra superior do editor que te deixa gravar o palco do projeto.", + "mediarecorder/@name": "Gravador de vídeo do projeto", + "drag-drop/@description": "Te deixa arrastar imagens e sons do seu computador até a lista de atores, fantasias ou sons. Você também pode arrastar arquivos de texto até listas ou a entrada de resposta do bloco \"pergunte e espere\".", + "drag-drop/@name": "Arrastar arquivos", + "drag-drop/@settings-name-use-hd-upload": "Carregar imagens em HD", + "debugger/@name": "Depurador", + "debugger/@settings-name-log_broadcasts": "Registrar transmissões de mensagens", + "debugger/@settings-name-log_clear_greenflag": "Excluir registros ao clicar na bandeira verde", + "debugger/@settings-name-log_clone_create": "Registrar criações de clone", + "debugger/@settings-name-log_failed_clone_creation": "Registrar quando o valor máximo de clones for atingido", + "debugger/@settings-name-log_greenflag": "Registrar quando a bandeira verde for clicada", + "debugger/@update": "Novas abas \"Linhas de execução\" e \"Performance\" na janela de debug.", + "pause/@description": "Adiciona um botão de pausa do lado da bandeira verde.", + "pause/@name": "Botão de pausa", + "mute-project/@description": "Ctrl+Clique na bandeira verde para mutar/desmutar o projeto.", + "mute-project/@info-macOS": "No macOS, use a tecla Cmd ao invés de Ctrl.", + "mute-project/@name": "Modo projeto mutado", + "vol-slider/@name": "Slider de volume do projeto", + "vol-slider/@settings-name-defVol": "Volume padrão", + "clones/@description": "Adiciona um contador acima do palco no editor que mostra o número total de clones.", + "clones/@name": "Contador de clones", + "clones/@settings-name-showicononly": "Mostrar apenas o ícone", + "mouse-pos/@description": "Mostra a posição do mouse próxima à bandeira acima do palco no editor.", + "mouse-pos/@name": "Posição do mouse", + "color-picker/@description": "Adiciona entradas para código hex à paleta de cores.", + "color-picker/@name": "Seletor de cor hex", + "remove-sprite-confirm/@description": "Pede confirmação antes de deletar um ator dentro de um projeto.", + "remove-sprite-confirm/@name": "Confirmação ao deletar ator", + "block-count/@description": "Mostra o número total de blocos em um projeto na barra de menu do editor. Anteriormente fazia parte do addon \"contador de atores e scripts\".", + "block-count/@name": "Número de blocos", + "onion-skinning/@description": "Mostra uma cópia transparente das fantasias anteriores e posteriores ao editar uma fantasia. Controlado por botões em baixo do editor de fantasia ao lado dos botões de zoom.", + "onion-skinning/@settings-name-afterTint": "Cor da próxima fantasia", + "onion-skinning/@settings-name-beforeTint": "Cor da fantasia anterior", + "onion-skinning/@settings-name-default": "Ligar por padrão", + "onion-skinning/@settings-name-layering": "Camada padrão", + "onion-skinning/@settings-name-mode": "Modo padrão", + "onion-skinning/@settings-name-next": "Número padrão de próximas fantasias", + "onion-skinning/@settings-name-opacity": "Opacidade (%)", + "onion-skinning/@settings-name-opacityStep": "Aumento de Opacidade (%)", + "onion-skinning/@settings-name-previous": "Número padrão de fantasias anteriores", + "onion-skinning/@settings-select-layering-behind": "Atrás", + "onion-skinning/@settings-select-layering-front": "Na frente", + "onion-skinning/@settings-select-mode-merge": "Transparente", + "onion-skinning/@settings-select-mode-tint": "Colorido", + "default-costume-editor-color/@description": "Muda o padrão das cores e do tamanho da borda usado pelo editor de fantasias.", + "default-costume-editor-color/@name": "Customizar padrões de cor do editor de fantasias", + "default-costume-editor-color/@settings-name-fill": "Cor de preenchimento padrão", + "default-costume-editor-color/@settings-name-stroke": "Cor da borda padrão", + "default-costume-editor-color/@settings-name-strokeSize": "Tamanho da borda padrão", + "bitmap-copy/@description": "Te deixa copiar uma imagem bitmap do editor de fantasia e colar em outros sites ou programas.", + "bitmap-copy/@info-norightclick": "\"Botão direito → copiar\" não funciona. Você precisa apertar Ctrl+C enquanto tiver uma imagem bitmap selecionada.", + "bitmap-copy/@name": "Copiar imagens bitmap", + "2d-color-picker/@description": "Troca os sliders de saturação e brilho por um seletor de cor 2D. Segure Shift enquanto arrasta o cursor para mudar valores em apenas uma direção.", + "2d-color-picker/@name": "Paleta de cores 2D", + "better-img-uploads/@description": "Adiciona um novo botão em cima do botão \"Carregar Fantasia\" que automaticamente converte um arquivo de imagem bitmap para imagens SVG (vetoriais) para não perder qualidade.", + "better-img-uploads/@info-notSuitableEdit": "Não use o botão de upload HD se você quer poder editar a imagem depois de carregá-la.", + "better-img-uploads/@name": "Upload de imagens HD", + "better-img-uploads/@settings-name-fitting": "Tamanho da imagem", + "better-img-uploads/@settings-select-fitting-fill": "Esticar para preencher o palco", + "better-img-uploads/@settings-select-fitting-fit": "Diminuir para caber no palco", + "better-img-uploads/@settings-select-fitting-full": "Tamanho original", + "custom-block-shape/@description": "Ajuste o tamanho, raio de canto e altura do encaixe dos blocos do Scratch.", + "custom-block-shape/@info-paddingWarning": "Só você pode ver o tamanho customizado que você escolheu pros blocos, então quando outras pessoas verem os seus projetos, os scripts podem ficar amontoados.", + "custom-block-shape/@name": "Formato de bloco customizável", + "custom-block-shape/@preset-description-default2": "Uma aparência parecida com os blocos do Scratch 2.0", + "custom-block-shape/@preset-description-default3": "A aparência normal dos blocos do Scratch 3.0", + "custom-block-shape/@preset-description-flat2": "Blocos do Scratch 2.0 mas com encaixes e cantos removidos", + "custom-block-shape/@preset-description-flat3": "Blocos do Scratch 3.0 mas com encaixes e cantos removidos", + "custom-block-shape/@preset-name-default2": "Blocos 2.0", + "custom-block-shape/@preset-name-default3": "Blocos 3.0", + "custom-block-shape/@preset-name-flat2": "2.0 Liso", + "custom-block-shape/@preset-name-flat3": "3.0 Liso", + "custom-block-shape/@settings-name-cornerSize": "Raio de canto (0-300%)", + "custom-block-shape/@settings-name-notchSize": "Altura do encaixe (0-150%)", + "custom-block-shape/@settings-name-paddingSize": "Tamanho do bloco (50-200%)", + "zebra-striping/@settings-name-intensity": "Intensidade (0-100%)", + "zebra-striping/@settings-name-shade": "Sombrear", + "zebra-striping/@settings-select-shade-darker": "Escurecer", + "zebra-striping/@settings-select-shade-lighter": "Clarear", + "editor-theme3/@description": "Edite as cores dos blocos de cada categoria no editor.", + "editor-theme3/@name": "Cores de bloco customizadas", + "editor-theme3/@preset-description-black": "Deixa os blocos pretos", + "editor-theme3/@preset-description-dark": "Versões escuras das cores padrão", + "editor-theme3/@preset-description-original": "As cores de blocos originais do Scratch 2.0", + "editor-theme3/@preset-description-tweaks": "Cores inspiradas no 2.0 nos blocos de Evento, Controle e Customizados.", + "editor-theme3/@preset-name-black": "Preto", + "editor-theme3/@preset-name-dark": "Escuro", + "editor-theme3/@preset-name-original": "Cores do 2.0", + "editor-theme3/@preset-name-tweaks": "Ajustes ao 3.0", + "editor-theme3/@settings-name-Pen-color": "extensões", + "editor-theme3/@settings-name-comment-color": "Comentários", + "editor-theme3/@settings-name-control-color": "controle", + "editor-theme3/@settings-name-custom-color": "meus blocos", + "editor-theme3/@settings-name-data-color": "variáveis", + "editor-theme3/@settings-name-data-lists-color": "listas", + "editor-theme3/@settings-name-events-color": "eventos", + "editor-theme3/@settings-name-input-color": "Entradas de texto nos blocos", + "editor-theme3/@settings-name-looks-color": "aparência", + "editor-theme3/@settings-name-motion-color": "movimento", + "editor-theme3/@settings-name-operators-color": "operadores", + "editor-theme3/@settings-name-sensing-color": "sensores", + "editor-theme3/@settings-name-sounds-color": "som", + "editor-theme3/@settings-name-text": "Cor do texto", + "editor-theme3/@settings-select-text-black": "Preto", + "editor-theme3/@settings-select-text-colorOnBlack": "Colorido no fundo preto", + "editor-theme3/@settings-select-text-colorOnWhite": "Colorido no fundo branco", + "editor-theme3/@settings-select-text-white": "Branco", + "custom-block-text/@description": "Muda a grossura do texto nos blocos e pode também adicionar uma sombra ao texto.", + "custom-block-text/@name": "Mudar estilo de texto dos blocos", + "custom-block-text/@settings-name-bold": "Texto em negrito", + "custom-block-text/@settings-name-shadow": "Sombra no texto", + "editor-colored-context-menus/@description": "Põe cor no menu que aparece ao clicar em um bloco com o botão direito.", + "editor-colored-context-menus/@name": "Menus de contexto coloridos", + "editor-stage-left/@description": "Move o palco para o lado esquerdo do editor, como no Scratch 2.0.", + "editor-stage-left/@name": "Mostrar palco do lado esquerdo", + "editor-buttons-reverse-order/@description": "Moverá a bandeira verde e o botão de pare para direita e no modo tela cheia os moverá para a direita, como no Scratch 2.0.", + "editor-buttons-reverse-order/@name": "Reverter ordem dos botões de controle de projeto", + "variable-manager/@description": "Adiciona uma aba do lado de \"Sons\" no editor para facilmente editar variáveis e listas.", + "variable-manager/@name": "Administrador de variáveis", + "search-sprites/@description": "Adiciona uma barra de busca ao painel de atores para pesquisar por atores pelo nome.", + "search-sprites/@name": "Buscar atores pelo nome", + "gamepad/@description": "Interaja com projetos usando um controle USB ou Bluetooth", + "gamepad/@name": "Suporte para controle", + "gamepad/@settings-name-hide": "Esconder botão de configuração quando não houver controle detectado", + "editor-sounds/@description": "Toca sons quando você conecta ou deleta blocos.", + "editor-sounds/@name": "Sons no editor", + "folders/@description": "Adiciona pastas para o painel de atores, assim como os paineis de fantasia e de sons. Para criar uma pasta. Clique com o botão direito em qualquer ator e clique em \"Criar pasta\". Clique em uma pasta para abri-la ou fechá-la. Clique um ator com o botão direito para ver quais pastas você pode movê-lo, ou arraste e solte o ator dentro de uma pasta aberta. Esse recurso funciona adicionando \"[nomeDaPasta]//\" no começo do nome dos seus atores.", + "folders/@info-notice-folders-are-public": "Usuários com essa função ligada poderão ver as pastas no seu projeto. O resto verá a lista de atores normalmente (sem pastas).", + "folders/@name": "Pastas de atores", + "block-switching/@description": "Clique com o botão direito em um bloco para trocá-lo por um bloco relacionado.", + "block-switching/@name": "Trocar blocos", + "block-switching/@settings-name-control": "Blocos de controle", + "block-switching/@settings-name-customargs": "Argumentos do bloco customizado", + "block-switching/@settings-name-customargsmode": "Opções de argumentos do bloco customizado à mostra", + "block-switching/@settings-name-data": "Blocos de variáveis e listas", + "block-switching/@settings-name-event": "Blocos de evento", + "block-switching/@settings-name-extension": "Blocos de extensões", + "block-switching/@settings-name-looks": "Blocos de aparência", + "block-switching/@settings-name-motion": "Blocos de movimento", + "block-switching/@settings-name-noop": "Mostrar opção de trocar um bloco para ele mesmo", + "block-switching/@settings-name-operator": "Blocos operadores", + "block-switching/@settings-name-sensing": "Blocos sensores", + "block-switching/@settings-name-sound": "Blocos de som", + "block-switching/@settings-select-customargsmode-all": "Argumentos em todos os blocos customizados neste ator", + "block-switching/@settings-select-customargsmode-defOnly": "Argumentos neste bloco customizado", + "load-extensions/@description": "Adiciona as extensões de música, caneta, e outras automaticamente à lista de categorias de blocos.", + "load-extensions/@name": "Automaticamente adicionar extensões", + "load-extensions/@settings-name-music": "Música", + "load-extensions/@settings-name-pen": "Caneta", + "load-extensions/@settings-name-text2speech": "Texto para Fala", + "load-extensions/@settings-name-translate": "Traduzir", + "custom-zoom/@description": "Mude o zoom mínimo, máximo, inicial, e sua velocidade no editor de código, e deixe os controles esconderem sozinhos.", + "custom-zoom/@name": "Configurações de zoom na área de script", + "custom-zoom/@settings-name-autohide": "Auto-esconder Controles de Zoom", + "custom-zoom/@settings-name-maxZoom": "Zoom Máximo (100-500%)", + "custom-zoom/@settings-name-minZoom": "Zoom Mínimo (1-100%)", + "custom-zoom/@settings-name-startZoom": "Zoom Inicial (50-500%)", + "custom-zoom/@settings-name-zoomSpeed": "Velocidade de Zoom (50-200%)", + "custom-zoom/@settings-select-speed-default": "Padrão", + "initialise-sprite-position/@description": "Muda a posição x/y padrão de novos atores.", + "initialise-sprite-position/@name": "Posição padrão customizável para novos atores", + "initialise-sprite-position/@settings-name-duplicate": "Comportamento ao duplicar sprites", + "initialise-sprite-position/@settings-name-library": "Posição aleatória para atores da biblioteca", + "initialise-sprite-position/@settings-name-x": "Posição X", + "initialise-sprite-position/@settings-name-y": "Posição Y", + "initialise-sprite-position/@settings-select-duplicate-custom": "Enviar para valores x/y específicos", + "initialise-sprite-position/@settings-select-duplicate-keep": "Manter o mesmo como o sprite original", + "initialise-sprite-position/@settings-select-duplicate-randomize": "Randomizar", + "blocks2image/@description": "Clique com o botão direito na área de scripts para exportar blocos como imagens SVG/PNG.", + "blocks2image/@name": "Salvar blocos como imagem", + "remove-curved-stage-border/@description": "Remove a borda arredondada do palco, e assim te deixa ver os cantos.", + "remove-curved-stage-border/@name": "Remover borda arredondada do palco", + "transparent-orphans/@description": "Mude a transparência dos blocos no editor, com opções separadas para blocos órfãos (blocos que não estão conectados a um bloco de chapéu) e blocos sendo arrastados.", + "transparent-orphans/@name": "Blocos transparentes", + "transparent-orphans/@settings-name-block": "Transparência para blocos (%)", + "transparent-orphans/@settings-name-dragged": "Transparência para blocos sendo arrastados (%)", + "transparent-orphans/@settings-name-orphan": "Transparência para blocos órfãos (%)", + "paint-by-default/@description": "Muda a ação padrão dos botões \"Selecionar novo Ator/Fantasia/Fundo/Som\" que, por padrão, abrem a biblioteca do Scratch.", + "paint-by-default/@name": "Pintar nova fantasia por padrão", + "paint-by-default/@settings-name-backdrop": "Adicionar fundo", + "paint-by-default/@settings-name-costume": "Adicionar fantasia", + "paint-by-default/@settings-name-sound": "Adicionar som", + "paint-by-default/@settings-name-sprite": "Adicionar ator", + "paint-by-default/@settings-select-backdrop-library": "Biblioteca", + "paint-by-default/@settings-select-backdrop-paint": "Desenhar", + "paint-by-default/@settings-select-backdrop-surprise": "Surpresa", + "paint-by-default/@settings-select-backdrop-upload": "Carregar arquivo", + "paint-by-default/@settings-select-costume-library": "Biblioteca", + "paint-by-default/@settings-select-costume-paint": "Desenhar", + "paint-by-default/@settings-select-costume-surprise": "Surpresa", + "paint-by-default/@settings-select-costume-upload": "Carregar arquivo", + "paint-by-default/@settings-select-sound-library": "Biblioteca", + "paint-by-default/@settings-select-sound-record": "Gravar", + "paint-by-default/@settings-select-sound-surprise": "Surpresa", + "paint-by-default/@settings-select-sound-upload": "Carregar arquivo", + "paint-by-default/@settings-select-sprite-library": "Biblioteca", + "paint-by-default/@settings-select-sprite-paint": "Desenhar", + "paint-by-default/@settings-select-sprite-surprise": "Surpresa", + "paint-by-default/@settings-select-sprite-upload": "Carregar arquivo", + "block-cherry-picking/@description": "Te deixa arrastar um único bloco do meio de um script (ao invés de levar junto todos os blocos conectados a ele) ao segurar a tecla Ctrl.", + "block-cherry-picking/@info-flipControls": "Se você ativar a opção \"trocar padrão\", você irá arrastar blocos individualmente por padrão. Então, segure Ctrl para arrastar uma pilha.", + "block-cherry-picking/@info-macContextDisabled": "No macOS, use a tecla Cmd ao invés de Ctrl.", + "block-cherry-picking/@name": "Arrastar um único bloco com a tecla Ctrl", + "block-cherry-picking/@settings-name-invertDrag": "Trocar padrão", + "hide-new-variables/@description": "Não criar monitores automaticamente para novos variáveis ou listas.", + "hide-new-variables/@name": "Esconder novas variáveis", + "editor-extra-keys/@info-experimentalKeysWarn": "Entre as \"teclas experimentais\" estão o sinal de igual, barra, ponto e vírgula, entre outros. Elas podem não funcionar em todos os sistemas operacionais ou layouts de teclado.", + "editor-extra-keys/@info-shiftKeysWarn": "Entre as \"teclas Shift\" estão teclas que normalmente requerem apertar a tecla Shift e uma tecla de número, como a hashtag, ponto de exclamação, entre outros. Essas teclas só funcionam no bloco \"quando a tecla () for apertada\" e não funcionam em todos os sistemas operacionais ou layouts de teclado.", + "hide-delete-button/@description": "Esconde o botão de deletar (ícone da lata de lixo) de atores, fantasias e sons. Eles ainda podem ser deletados clicando com o botão direito do mouse.", + "hide-delete-button/@name": "Esconder botão de deletar", + "hide-delete-button/@settings-name-costumes": "Fantasias e fundos", + "hide-delete-button/@settings-name-sounds": "Sons", + "hide-delete-button/@settings-name-sprites": "Atores", + "no-script-bumping/@description": "Permite que você mova e modifique scripts sem que eles movam ao serem sobrepostos por outro script.", + "no-script-bumping/@name": "Não mover scripts sobrepostos automaticamente", + "disable-stage-drag-select/@description": "Remove a habilidade de arrastar atores no palco no Editor, exceto aqueles que explicitamente estão definidos como arrastável. Segure Shift enquanto arrasta um personagem pra movê-lo normalmente.", + "disable-stage-drag-select/@name": "Atores não arrastáveis no editor", + "move-to-top-bottom/@name": "Mover fantasia ao topo ou ao fundo da lista", + "disable-paste-offset/@description": "Cola itens copiados em sua posição original ao invés de movê-los no editor de fantasia.", + "disable-paste-offset/@name": "Não mover itens colados", + "block-duplicate/@description": "Duplique um script rapidamente arrastando-o enquanto segura a tecla Alt. Segure Ctrl junto para duplicar só um único bloco ao invés da pilha inteira conectada.", + "block-duplicate/@info-mac": "No macOS, use a tecla Option ao invés de Alt e Command ao invés de Ctrl.", + "block-duplicate/@name": "Duplicar script segurando Alt", + "swap-local-global/@description": "Adiciona mais opções ao renomear uma variável ou lista existente: permite trocar entre a opção \"Para todos os atores\" e \"Apenas para este ator\" e trocar se as variáveis são guardadas na nuvem ou não. Também adiciona uma nova opção ao clicar com o botão direito em uma variável/lista para rapidamente trocar seu acesso.", + "swap-local-global/@name": "Trocar variáveis entre \"Para todos os atores\" e \"Apenas para este ator\"", + "editor-comment-previews/@description": "Te deixa ver o texto de comentários ao passar o mouse em cima de comentários fechados e blocos. Você pode usar isso para ver comentários fora da tela, identificar um loop pela ponta inferior através de sua pré-visualização, encaixar vários comentários em um espaço pequeno, e mais.", + "editor-comment-previews/@name": "Pré-visualização de comentários no editor", + "editor-comment-previews/@settings-name-delay": "Tempo de espera", + "editor-comment-previews/@settings-name-follow-mouse": "Seguir o mouse", + "editor-comment-previews/@settings-name-hover-view": "Pré-visualizar ao passar o mouse em comentários fechados", + "editor-comment-previews/@settings-name-hover-view-block": "Pré-visualizar ao passar o mouse em blocos com comentários ligados a eles", + "editor-comment-previews/@settings-name-hover-view-procedure": "Pré-visualizar o comentário ligado à definição ao passar o mouse em blocos customizados", + "editor-comment-previews/@settings-name-reduce-animation": "Reduzir animação", + "editor-comment-previews/@settings-name-reduce-transparency": "Reduzir transparência", + "editor-comment-previews/@settings-select-delay-long": "Longo", + "editor-comment-previews/@settings-select-delay-none": "Nenhum", + "editor-comment-previews/@settings-select-delay-short": "Curto", + "columns/@description": "Divide o menu de categorias em duas colunas e o move para o topo da paleta de blocos, assim como no Scratch 2.0.", + "columns/@name": "Menu de categoria de duas colunas", + "script-snap/@description": "Arraste um script para automaticamente alinhas sua posição à grade de pontos.", + "script-snap/@name": "Alinhar scripts à grade", + "script-snap/@preset-name-default": "Padrão", + "script-snap/@preset-name-half-block": "Meio bloco", + "script-snap/@preset-name-whole-block": "Bloco inteiro", + "script-snap/@settings-name-grid": "Tamanho da grade (px)", + "fullscreen/@description": "Conserta alguns efeitos indesejados no modo tela cheia do player de projeto, ativa o modo tela cheia do seu navegador, e esconde a barra superior, onde tem a bandeira verde.", + "fullscreen/@info-hideToolbarNotice": "Se escolher esconder a barra superior, lembre-se que você pode apertar a tecla Esc para sair do modo tela cheia do projeto.", + "fullscreen/@name": "Tela cheia melhorada", + "fullscreen/@settings-name-browserFullscreen": "Abrir projeto em tela cheia com o navegador em tela cheia", + "fullscreen/@settings-name-hideToolbar": "Esconder barra superior na tela cheia", + "hide-stage/@name": "Esconder painel do palco e sprite", + "editor-stepping/@description": "Adiciona uma borda colorida aos blocos que estão rodando em um projeto.", + "editor-stepping/@name": "Destacar blocos em execução", + "editor-stepping/@settings-name-highlight-color": "Cor de destaque" +} \ No newline at end of file diff --git a/src/addons/addons-l10n-settings/ro.json b/src/addons/addons-l10n-settings/ro.json new file mode 100644 index 0000000000000000000000000000000000000000..f99f7d5d4eda1554b3776df2c9764038478439e8 --- /dev/null +++ b/src/addons/addons-l10n-settings/ro.json @@ -0,0 +1,142 @@ +{ + "cat-blocks/@description": "Aduce înapoi în editor blocurile pălărie pisică din Ziua Farselor din 2020.", + "cat-blocks/@name": "Blocuri Pisică", + "editor-devtools/@name": "Instrumente pentru dezvoltatori", + "editor-searchable-dropdowns/@name": "Căutare în listele de opțiuni", + "data-category-tweaks-v2/@name": "Îmbunătățiri pentru categoriile de date", + "data-category-tweaks-v2/@settings-name-moveReportersDown": "Mută blocurile de date deasupra listei de variabile", + "data-category-tweaks-v2/@settings-name-separateListCategory": "Separă variabilele de liste", + "data-category-tweaks-v2/@settings-name-separateLocalVariables": "Separă Variabilele Doar Pentru acest Personaj", + "block-palette-icons/@name": "Pictograme ale categoriilor din paleta de blocuri", + "hide-flyout/@description": "Ascunde paleta de blocuri dacă nu se ține mouse-ul deasupra ei. Apasă pe pictograma blochează pentru a o ține la locul ei temporar. Altfel, folosește modul „clic pe categorie”.", + "hide-flyout/@info-hoverExplanation": "Modul „Pune cursorul deasupra zonei paletei” doar extinde zona vizuală. Dacă vrei să poți trage blocuri în acea zonă fără ca acestea să fie șterse, folosește unul dintre celelalte moduri.", + "hide-flyout/@settings-name-toggle": "Pornește...", + "hide-flyout/@settings-select-speed-default": "Implicit", + "hide-flyout/@settings-select-toggle-category": "Clic pe categorie", + "hide-flyout/@settings-select-toggle-cathover": "Pune cursorul deasupra categoriei", + "hide-flyout/@settings-select-toggle-hover": "Pune cursorul deasupra zonei paletei", + "drag-drop/@name": "Trage și dă drumul fișierelor", + "pause/@description": "Adaugă un buton de pauză lângă steagul verde.", + "pause/@name": "Buton de Pauză", + "mute-project/@description": "Ctrl+Apasă pe steag pentru a activa/dezactiva sunetul proiectului.", + "clones/@name": "Contor de clone", + "mouse-pos/@name": "Poziția cursorului", + "color-picker/@description": "Adaugă introducerea de culori hex în selectoarele de culoare.", + "color-picker/@name": "Selector de culoare hex", + "remove-sprite-confirm/@description": "Te întreabă dacă ești sigur când ștergi un personaj în interiorul unui proiect.", + "block-count/@name": "Număr de blocuri", + "onion-skinning/@name": "Modul Costume suprapuse - Onion skinning", + "onion-skinning/@settings-name-afterTint": "Culoarea costumelor următoare", + "onion-skinning/@settings-name-beforeTint": "Culoarea costumelor anterioare", + "onion-skinning/@settings-name-default": "Activează în mod implicit", + "onion-skinning/@settings-name-layering": "Stratificare implicită", + "onion-skinning/@settings-name-mode": "Mod implicit", + "onion-skinning/@settings-name-next": "Număr implicit de costume următoare", + "onion-skinning/@settings-name-opacity": "Opacitate (%)", + "onion-skinning/@settings-name-opacityStep": "Creșterea Opacității (%)", + "onion-skinning/@settings-name-previous": "Număr implicit de costume anterioare", + "onion-skinning/@settings-select-layering-behind": "În spate", + "onion-skinning/@settings-select-layering-front": "Deasupra", + "onion-skinning/@settings-select-mode-merge": "Combină imaginile", + "onion-skinning/@settings-select-mode-tint": "Nuanța Culorilor", + "bitmap-copy/@info-norightclick": "„Click dreapta → copiază” nu este suportat. Trebuie să apăsați Ctrl+C cât timp o imagine bitmap este selectată.", + "bitmap-copy/@name": "Copiere imagini bitmap", + "2d-color-picker/@name": "Paletă de culoare 2D", + "custom-block-shape/@preset-name-default2": "Blocuri 2.0", + "custom-block-shape/@preset-name-default3": "Blocuri 3.0", + "custom-block-shape/@preset-name-flat2": "2.0 Plat", + "custom-block-shape/@preset-name-flat3": "3.0 Plat", + "custom-block-shape/@settings-name-cornerSize": "Mărimea colțului (0-300%)", + "editor-theme3/@description": "Editează culoarea blocurilor pentru fiecare categorie în editor.", + "editor-theme3/@name": "Culori personalizate ale blocurilor", + "editor-theme3/@preset-description-black": "Face fundalul blocurilor negru", + "editor-theme3/@preset-description-dark": "Versiuni întunecate ale culorilor implicite", + "editor-theme3/@preset-description-original": "Culorile originale ale blocurilor din Scratch 2.0", + "editor-theme3/@preset-description-tweaks": "Culorile Blocurilor Personalizate, de Evenimente și de Control inspirate din Scratch 2.0", + "editor-theme3/@preset-name-black": "Negru", + "editor-theme3/@preset-name-dark": "Întunecat", + "editor-theme3/@preset-name-original": "Culori 2.0", + "editor-theme3/@preset-name-tweaks": "Modificări 3.0", + "editor-theme3/@settings-name-Pen-color": "extensii", + "editor-theme3/@settings-name-custom-color": "blocuri personalizate", + "editor-theme3/@settings-name-data-color": "variabile", + "editor-theme3/@settings-name-data-lists-color": "liste", + "editor-theme3/@settings-name-events-color": "evenimente", + "editor-theme3/@settings-name-input-color": "Intrări de text din blocuri", + "editor-theme3/@settings-name-looks-color": "aspect", + "editor-theme3/@settings-name-motion-color": "mișcare", + "editor-theme3/@settings-name-operators-color": "operatori", + "editor-theme3/@settings-name-sensing-color": "detectare", + "editor-theme3/@settings-name-sounds-color": "sunete", + "editor-theme3/@settings-name-text": "Culoarea textului", + "editor-theme3/@settings-select-text-black": "Negru", + "editor-theme3/@settings-select-text-colorOnBlack": "Colorat pe fundal negru", + "editor-theme3/@settings-select-text-colorOnWhite": "Colorat pe fundal alb", + "editor-theme3/@settings-select-text-white": "Alb", + "custom-block-text/@settings-name-bold": "Text îngroșat (bold)", + "custom-block-text/@settings-name-shadow": "Umbră sub text", + "editor-colored-context-menus/@description": "Face meniurile de context colorate când se dă clic-dreapta pe un bloc.", + "editor-colored-context-menus/@name": "Meniuri de context colorate", + "editor-stage-left/@name": "Afișează scena pe partea stângă", + "variable-manager/@description": "Adaugă o filă lângă „sunete” în editor pentru pentru a actualiza ușor variabile și liste.", + "variable-manager/@name": "Administrator de Variabile", + "search-sprites/@description": "Adaugă o cutie de căutare la panoul personajelor pentru a căuta personaje după nume.", + "search-sprites/@name": "Caută personaje după nume", + "gamepad/@name": "Suport gamepad", + "editor-sounds/@description": "Redă efecte sonore la conectarea și la ștergerea blocurilor.", + "editor-sounds/@name": "Efecte sonore în editor", + "folders/@info-notice-folders-are-public": "Utilizatorii cu această funcție activată vor putea să vadă dosarele din proiectul tău. Oricine altcineva va vedea lista personajelor normal (fără dosare).", + "folders/@name": "Dosare de Personaje", + "block-switching/@description": "Dați click-dreapta pe un bloc pentru a-l schimba într-unul cu un conținut asemânător.", + "block-switching/@name": "Schimbarea blocurilor", + "block-switching/@settings-name-control": "Blocuri Control", + "block-switching/@settings-name-data": "Blocuri de Liste și Variabile", + "block-switching/@settings-name-event": "Evenimente", + "block-switching/@settings-name-extension": "Blocuri de Extensii", + "block-switching/@settings-name-looks": "Blocuri Aspect", + "block-switching/@settings-name-motion": "Blocuri Mișcare", + "block-switching/@settings-name-noop": "Afișați opțiunea pentru a schimba blocul în el înșine", + "block-switching/@settings-name-operator": "Operatori", + "block-switching/@settings-name-sensing": "Blocuri Detectare", + "block-switching/@settings-name-sound": "Blocuri de Sunet", + "load-extensions/@settings-name-music": "Muzică", + "load-extensions/@settings-name-pen": "Stilou", + "load-extensions/@settings-name-text2speech": "Text în Vorbire", + "load-extensions/@settings-name-translate": "Traducere", + "custom-zoom/@settings-select-speed-default": "Implicit", + "blocks2image/@name": "Salvează blocurile ca imagine", + "remove-curved-stage-border/@name": "Elimină marginea scenei curbată", + "paint-by-default/@name": "Pictează costumele în mod prestabilit", + "paint-by-default/@settings-name-backdrop": "Adaugă fundal", + "paint-by-default/@settings-name-costume": "Adaugă costum", + "paint-by-default/@settings-name-sound": "Adaugă sunet", + "paint-by-default/@settings-name-sprite": "Adaugă personaj", + "paint-by-default/@settings-select-backdrop-library": "Librărie", + "paint-by-default/@settings-select-backdrop-paint": "Pictează", + "paint-by-default/@settings-select-backdrop-surprise": "Surpriză", + "paint-by-default/@settings-select-backdrop-upload": "Încarcă", + "paint-by-default/@settings-select-costume-library": "Librărie", + "paint-by-default/@settings-select-costume-paint": "Pictează", + "paint-by-default/@settings-select-costume-surprise": "Surpriză", + "paint-by-default/@settings-select-costume-upload": "Încarcă", + "paint-by-default/@settings-select-sound-library": "Librărie", + "paint-by-default/@settings-select-sound-record": "Înregistrează", + "paint-by-default/@settings-select-sound-surprise": "Surpriză", + "paint-by-default/@settings-select-sound-upload": "Încarcă", + "paint-by-default/@settings-select-sprite-library": "Librărie", + "paint-by-default/@settings-select-sprite-paint": "Pictează", + "paint-by-default/@settings-select-sprite-surprise": "Surpriză", + "paint-by-default/@settings-select-sprite-upload": "Încarcă", + "hide-delete-button/@name": "Ascunde butonul de ștergere", + "hide-delete-button/@settings-name-costumes": "Costume și decoruri", + "hide-delete-button/@settings-name-sounds": "Sunete", + "hide-delete-button/@settings-name-sprites": "Personaje", + "editor-comment-previews/@settings-name-follow-mouse": "Urmărește mouse-ul", + "editor-comment-previews/@settings-select-delay-long": "Lungă", + "editor-comment-previews/@settings-select-delay-none": "Niciuna", + "editor-comment-previews/@settings-select-delay-short": "Scurtă", + "script-snap/@preset-name-default": "Prestabilit", + "script-snap/@preset-name-half-block": "Jumătate de bloc", + "script-snap/@preset-name-whole-block": "Întregul-bloc", + "editor-stepping/@name": "Scoate în evidență blocurile care rulează" +} \ No newline at end of file diff --git a/src/addons/addons-l10n-settings/ru.json b/src/addons/addons-l10n-settings/ru.json new file mode 100644 index 0000000000000000000000000000000000000000..5b27c30c3bbd57027676f1c4b128bb57f6845d80 --- /dev/null +++ b/src/addons/addons-l10n-settings/ru.json @@ -0,0 +1,346 @@ +{ + "cat-blocks/@description": "Возвращает обратно в редактор котоблоки с первого апреля 2020.", + "cat-blocks/@info-watch": "Когда открыт редактор, параметр \"Следить за указателем мыши\" может влиять на производительность.", + "cat-blocks/@name": "Котоблоки", + "cat-blocks/@settings-name-watch": "Следить за указателем мыши", + "editor-devtools/@description": "Добавляет новые опции в меню редактора: копирование/вставка блоков,улучшенная очистка,и прочее!", + "editor-devtools/@name": "Инструменты разработчика", + "editor-devtools/@settings-name-enableCleanUpPlus": "Улучшение \"Очистить блоки\"", + "editor-devtools/@settings-name-enablePasteBlocksAtMouse": "Вставлять блоки под курсором мыши", + "find-bar/@description": "Добавляет строку поиска чтобы искать скрипты,костюмы и звуки во вкладке звуков.Используйте Ctrl + стрелка влево и Ctrl + стрелка вправо в зоне с кодом,для перехода к ледующей и предыдущей посещённой позиции,после использования строки поиска", + "find-bar/@info-developer-tools": "Этот аддон раньше был частью \"инструментов разработчика\" ,но теперь переехал сюда", + "find-bar/@name": "Строка поиска в редакторе", + "middle-click-popup/@info-developer-tools": "Этот аддон раньше был частью \"инструментов разработчика\" ,но теперь переехал сюда", + "middle-click-popup/@name": "Вставлять блоки по имени", + "jump-to-def/@description": "Вызывает меню с поиском блоков и переменных при одновременном нажатии shift и левого клика мыши либо клика колёсиком мыши", + "jump-to-def/@info-developer-tools": "Этот аддон раньше был частью \"инструментов разработчика\" ,но теперь переехал сюда", + "jump-to-def/@name": "Вызывать быстрое меню вызова блоков", + "editor-searchable-dropdowns/@description": "Позволяет искать в раскрывающемся списке блоков.", + "editor-searchable-dropdowns/@name": "Поиск в выпадающих списках", + "data-category-tweaks-v2/@description": "Предоставляет настройки для категории блоков Данных (\"Переменные\").", + "data-category-tweaks-v2/@name": "Поправки категории данных ", + "data-category-tweaks-v2/@settings-name-moveReportersDown": "Переместить блоки данных выше списка переменных.", + "data-category-tweaks-v2/@settings-name-separateListCategory": "Отдельная категория списков.", + "data-category-tweaks-v2/@settings-name-separateLocalVariables": "Отделить переменные только для одного спрайта", + "block-palette-icons/@description": "Добавляет значки внутри цветных кружков, обозначающих категории блоков.", + "block-palette-icons/@name": "Значки категорий на палитре блоков", + "hide-flyout/@description": "Скрывает палитру блоков, если не наведен курсор мыши. Нажмите значок замка́, чтобы временно заблокировать её. Как вариант, используйте режим \"Нажатие категории\".", + "hide-flyout/@info-hoverExplanation": "Режим \"Наведение на область палитры\" только расширяет область просмотра. Если вы хотите иметь возможность перетаскивать блоки в эту область без их уничтожения, используйте один из других режимов.", + "hide-flyout/@name": "Автоскрытие палитры блоков", + "hide-flyout/@settings-name-speed": "Скорость анимации:", + "hide-flyout/@settings-name-toggle": "Включить...", + "hide-flyout/@settings-select-speed-default": "По умолчанию", + "hide-flyout/@settings-select-speed-long": "Медленная", + "hide-flyout/@settings-select-speed-none": "Моментальная", + "hide-flyout/@settings-select-speed-short": "Быстрая", + "hide-flyout/@settings-select-toggle-category": "Нажатие категории", + "hide-flyout/@settings-select-toggle-cathover": "Наведение на категорию", + "hide-flyout/@settings-select-toggle-hover": "Наведение на область палитры", + "hide-flyout/@update": "Этот аддон был обновлён,и было пофикшено много багов", + "mediarecorder/@description": "Добавляет кнопку \"начать запись\" в меню редактора, которая позволяет записывать сцену проекта.", + "mediarecorder/@name": "Запись проекта на видео", + "drag-drop/@description": "Позволяет перетаскивать файлы с компьютера прямо во вкладку костюмов/звуков спрайта", + "drag-drop/@name": "Перетаскивание файлов", + "drag-drop/@settings-name-use-hd-upload": "Использовать HD загрузку", + "debugger/@name": "Отладчик", + "debugger/@settings-name-log_broadcasts": "Логировать сообщения", + "debugger/@settings-name-log_clear_greenflag": "Очистить логи, когда зелёный флаг нажат", + "debugger/@settings-name-log_clone_create": "Логировать создания клонов", + "debugger/@settings-name-log_failed_clone_creation": "Логировать, когда макс. кол-во клонов превышено", + "debugger/@settings-name-log_greenflag": "Логировать нажатия на зелёный флажок", + "debugger/@update": "Новые вкладки \"Потоки\" и \"Производительность\" в окне отладки.", + "pause/@description": "Добавляет кнопку паузы рядом с зелёным флагом.", + "pause/@name": "Кнопка паузы", + "mute-project/@description": "Клавиша Ctrl + Клик по зелёному флагу чтобы выключить/включить звук проекта.", + "mute-project/@info-macOS": "В macOS используйте клавишу Cmd вместо клавиши Ctrl.", + "mute-project/@name": "Беззвучный режим проектов", + "vol-slider/@description": "Добавляет слайдер громкости к элементам управления проектом", + "vol-slider/@name": "Слайдер громкости проекта", + "vol-slider/@settings-name-defVol": "Стандартная громкость:", + "clones/@description": "Добавляет счётчик над сценой,который показывает список клонов", + "clones/@name": "Счётчик клонов", + "clones/@settings-name-showicononly": "Показывать только иконку", + "mouse-pos/@description": "Отображает координаты курсора мыши x/y в редакторе над сценой.", + "mouse-pos/@name": "Позиция мыши", + "color-picker/@description": "Добавляет ввод кодов hex в выбор цветов.", + "color-picker/@name": "Выбор цветов типа Hex", + "remove-sprite-confirm/@description": "Спрашивает, уверены ли вы при удалении спрайта внутри проекта.", + "remove-sprite-confirm/@name": "Подтверждение удаления спрайтов", + "block-count/@description": "Показывает количество блоков в проекте в верхней панели редактора. Раньше было частью «счётчик спрайтов и скриптов».", + "block-count/@name": "Счёт блоков", + "onion-skinning/@description": "Показывает полупрозрачное наслоение предыдущих/следующих костюмов в редакторе,как в программе для анимирования.Настройки рядом с кнопками размера", + "onion-skinning/@name": "Отображение Onion", + "onion-skinning/@settings-name-afterTint": "Следующая тонировка костюма", + "onion-skinning/@settings-name-beforeTint": "Предыдущий оттенок костюма", + "onion-skinning/@settings-name-default": "Включено по умолчанию", + "onion-skinning/@settings-name-layering": "Слои по умолчанию", + "onion-skinning/@settings-name-mode": "Режим по умолчанию", + "onion-skinning/@settings-name-next": "Следующие костюмы по умолчанию", + "onion-skinning/@settings-name-opacity": "Непрозрачность (%)", + "onion-skinning/@settings-name-opacityStep": "Уровень непрозрачности (%)", + "onion-skinning/@settings-name-previous": "Предыдущие костюмы по умолчанию", + "onion-skinning/@settings-select-layering-behind": "Сзади", + "onion-skinning/@settings-select-layering-front": "Впереди", + "onion-skinning/@settings-select-mode-merge": "Объединить изображения", + "onion-skinning/@settings-select-mode-tint": "Оттенок цвета", + "paint-snap/@description": "Привязывает объекты в редакторе костюмов ,к различным опорам ,как в более профессиональных векторных редакторах", + "paint-snap/@name": "Привязка в редакторе костюмов", + "paint-snap/@settings-name-boxCenter": "Привязки от центра выбора", + "paint-snap/@settings-name-boxCorners": "Привязки от углов выбора", + "paint-snap/@settings-name-boxEdgeMids": "Привязки от границ середины выбора", + "paint-snap/@settings-name-enable-default": "Включено по умолчанию", + "paint-snap/@settings-name-guide-color": "Цвет линий привязки", + "paint-snap/@settings-name-objectCenters": "Привязки к центру объектов", + "paint-snap/@settings-name-objectCorners": "Привязки к углам объектов", + "paint-snap/@settings-name-objectEdges": "Привязки к границам объектов", + "paint-snap/@settings-name-objectMidlines": "Привязки к средним линиям объектов", + "paint-snap/@settings-name-pageAxes": "Привязки к осям x и y", + "paint-snap/@settings-name-pageCenter": "Привязки к центру", + "paint-snap/@settings-name-pageCorners": "Привязки к углам", + "paint-snap/@settings-name-pageEdges": "Привязки к границам", + "paint-snap/@settings-name-threshold": "Дистанция привязки", + "default-costume-editor-color/@description": "Меняет цвета по умолчанию и размер контура, которые используются редактором костюмов.", + "default-costume-editor-color/@name": "Настраиваемые заводские цвета в редакторе костюмов", + "default-costume-editor-color/@settings-name-fill": "Цвет заливки", + "default-costume-editor-color/@settings-name-persistence": "Использует прошлый цвет,вместо перезапуска", + "default-costume-editor-color/@settings-name-stroke": "Цвет контура", + "default-costume-editor-color/@settings-name-strokeSize": "Размер контура", + "bitmap-copy/@description": "Позволяет копировать растровое изображение из редактора костюмов в системный буфер обмена, чтобы его можно было вставить на другие веб-сайты или в программное обеспечение.", + "bitmap-copy/@info-norightclick": "\"ПКМ → Копировать\" не поддерживается. Вам нужно нажать Ctrl+C пока растровое изображение выбрано.", + "bitmap-copy/@name": "Копирование растровых изображений", + "2d-color-picker/@description": "Заменяет ползунки насыщенности и яркости в редакторе костюмов двухмерной палитрой цветов. Удерживая нажатой клавишу Shift, перетащите курсор, чтобы изменить значения на одной оси.", + "2d-color-picker/@name": "2D-палитра цветов", + "better-img-uploads/@description": "Добавляет новую кнопку над кнопкой \"загрузить костюм\", которая автоматически преобразует загруженные растровые изображения в изображения SVG (векторные), чтобы избежать потери качества.", + "better-img-uploads/@info-notSuitableEdit": "Избегайте использования кнопки HD загрузки, если вы планируете редактировать изображение после загрузки.", + "better-img-uploads/@name": "HD загрузка изображений", + "better-img-uploads/@settings-name-fitting": "Размер изображения", + "better-img-uploads/@settings-select-fitting-fill": "Растянуть, чтобы заполнить сцену", + "better-img-uploads/@settings-select-fitting-fit": "Уменьшить, чтобы соответствовать сцене", + "better-img-uploads/@settings-select-fitting-full": "Оригинальный размер", + "pick-colors-from-stage/@description": "Теперь пипетка из редактора костюмов будет захватывать цвета и со сцены!", + "pick-colors-from-stage/@name": "Выбор цвета сцены в редакторе костюмов", + "custom-block-shape/@description": "Отрегулируйте отступы, радиус угла и высоту надреза блоков.", + "custom-block-shape/@info-paddingWarning": "Уменьшение размера отступа видно только вам, поэтому, когда ваши проекты просматриваются другими пользователями, ваши скрипты могут перекрываться.", + "custom-block-shape/@name": "Настраиваемая форма блоков", + "custom-block-shape/@preset-description-default2": "Внешний вид, похожий на блоки Scratch 2.0", + "custom-block-shape/@preset-description-default3": "Обычный внешний вид блоков Scratch 3.0", + "custom-block-shape/@preset-description-flat2": "Блоки Scratch 2.0 с удаленными вырезами и углами", + "custom-block-shape/@preset-description-flat3": "Блоки Scratch 3.0 с удаленными вырезами и углами", + "custom-block-shape/@preset-name-default2": "Блоки 2.0", + "custom-block-shape/@preset-name-default3": "Блоки 3.0", + "custom-block-shape/@preset-name-flat2": "Плоские 2.0", + "custom-block-shape/@preset-name-flat3": "Плоские 3.0", + "custom-block-shape/@settings-name-cornerSize": "Размер угла (0-300%)", + "custom-block-shape/@settings-name-notchSize": "Высота паза (0-150%)", + "custom-block-shape/@settings-name-paddingSize": "Размер отступов (50-200%)", + "zebra-striping/@description": "Делает цвета блоков одной категории ,которые вложены в другие блоки этой же категории ярче. Как у зебры.", + "zebra-striping/@name": "Другие цвета вложенных блоков", + "zebra-striping/@settings-name-intensity": "интенсивность (0-100%)", + "zebra-striping/@settings-name-shade": "Оттенок", + "zebra-striping/@settings-select-shade-darker": "затемнение", + "zebra-striping/@settings-select-shade-lighter": "Яркость", + "editor-theme3/@description": "Отредактируйте цвета блоков для каждой категории в редакторе.", + "editor-theme3/@name": "Настраиваемые цвета блоков", + "editor-theme3/@preset-description-black": "Делает фоны блоков чёрными", + "editor-theme3/@preset-description-dark": "Тёмные версии цветов по умолчанию", + "editor-theme3/@preset-description-original": "Оригинальные цвета блоков из Scratch 2.0", + "editor-theme3/@preset-description-tweaks": "Цвета блоков событий, управления и другие теперь можно сделать как в версии 2.0", + "editor-theme3/@preset-name-black": "Чёрный", + "editor-theme3/@preset-name-dark": "Тёмная", + "editor-theme3/@preset-name-original": "Цвета версии 2.0", + "editor-theme3/@preset-name-tweaks": "Цвета версии 3.0", + "editor-theme3/@settings-name-Pen-color": "расширения", + "editor-theme3/@settings-name-comment-color": "Комментарии", + "editor-theme3/@settings-name-control-color": "управление", + "editor-theme3/@settings-name-custom-color": "свои блоки", + "editor-theme3/@settings-name-data-color": "переменные", + "editor-theme3/@settings-name-data-lists-color": "списки", + "editor-theme3/@settings-name-events-color": "события", + "editor-theme3/@settings-name-input-color": "Поля ввода в блоках", + "editor-theme3/@settings-name-looks-color": "внешний вид", + "editor-theme3/@settings-name-motion-color": "движение", + "editor-theme3/@settings-name-operators-color": "операторы", + "editor-theme3/@settings-name-sensing-color": "сенсоры", + "editor-theme3/@settings-name-sounds-color": "звук", + "editor-theme3/@settings-name-text": "Цвет текста", + "editor-theme3/@settings-select-text-black": "Чёрный", + "editor-theme3/@settings-select-text-colorOnBlack": "Цветной на чёрном фоне", + "editor-theme3/@settings-select-text-colorOnWhite": "Цветной на белом фоне", + "editor-theme3/@settings-select-text-white": "Белый", + "editor-theme3/@update": "\"Тёмные комментарии\" переехали из \"Тёмной темы редактора\" сюда, и теперь их можно настраивать", + "custom-block-text/@description": "Изменяет толщину текста на блоках и дополнительно добавляет тень к тексту.", + "custom-block-text/@name": "Настраиваемый стиль текста блоков", + "custom-block-text/@settings-name-bold": "Жирный текст", + "custom-block-text/@settings-name-shadow": "Тень под текстом", + "editor-colored-context-menus/@description": "Делает контекстные меню, щёлкнутые правой кнопкой мыши по блоку более красочными.", + "editor-colored-context-menus/@name": "Цветные контекстные меню", + "editor-stage-left/@description": "Перемещает сцену в левую часть редактора, как в Scratch 2.0.", + "editor-stage-left/@info-reverseOrder": "Чтобы изменить положение кнопок над сценой, используйте аддон «поменять местами флажок и кнопку стоп».", + "editor-stage-left/@name": "Отображать сцену на левой стороне", + "editor-buttons-reverse-order/@description": "переместить кнопки флага и остановки направо,а кнопку полного экрана налево,как в scratch 2.0", + "editor-buttons-reverse-order/@name": "перевернуть элементы управления ", + "variable-manager/@description": "Добавляет вкладку рядом с \"звуки\" в редакторе для удобного обновления переменных и списков.", + "variable-manager/@name": "Менеджер переменных", + "variable-manager/@update": "Элементы в списках можно добавлять без зажатой клавиши shift", + "search-sprites/@description": "Добавляет поле поиска к панели спрайтов, чтобы искать спрайты по имени.", + "search-sprites/@name": "Поиск спрайтов по имени", + "sprite-properties/@description": "Прячет панель со свойствами спрайта ,как это было в scratch 2.0.Используй кнопку \"i\" на выбранном спрайте ,или нажми два раза на спрайт ,чтобы показать панель со свойствами. Чтобы обратно скрыть панель, нажми на кнопку скрытия на панели ,или же, нажми на спрайт два раза", + "sprite-properties/@name": "Прятать панель со свойствами спрайта", + "sprite-properties/@settings-name-autoCollapse": "Автоматически прятать ,когда будет убрана мышка", + "sprite-properties/@settings-name-hideByDefault": "Спрятать панель изначально", + "sprite-properties/@settings-name-transitionDuration": "Скорость анимации:", + "sprite-properties/@settings-select-transitionDuration-default": "Стандартная", + "sprite-properties/@settings-select-transitionDuration-long": "Медленная", + "sprite-properties/@settings-select-transitionDuration-none": "Моментальная", + "sprite-properties/@settings-select-transitionDuration-short": "Быстрая", + "gamepad/@description": "Взаимодействовать с проектами используя USB или Bluetooth контроллер/геймпад.", + "gamepad/@name": "Поддержка геймпада", + "gamepad/@settings-name-hide": "Спрятать кнопку настроек, если контроллеров не обнаружено", + "editor-sounds/@description": "Воспроизводит звуковые эффекты при соединении или удалении блоков.", + "editor-sounds/@name": "Звуковые эффекты редактора", + "folders/@description": "Добавляет папки в панель спрайтов,а также костюмов и звуков. Чтобы сделать папку, нажми по спрайту/звуку/костюму, нажми создать папку и назови её, чтобы добавить в папку звук/костюм/спрайт нажми правой кнопкой мыши и выбери добавить к папке", + "folders/@info-notice-folders-are-public": "Пользователи, у которых включена эта функция, смогут видеть папки в вашем проекте. Все остальные будут видеть списки спрайтов в обычном режиме (без папок).", + "folders/@name": "Папки спрайтов", + "block-switching/@description": "Щёлкните правой кнопкой мыши по блоку, чтобы заменить его на связанный блок.", + "block-switching/@name": "Замена блоков", + "block-switching/@settings-name-control": "Блоки управления", + "block-switching/@settings-name-customargs": "Аргументы пользовательских блоков", + "block-switching/@settings-name-customargsmode": "Параметры отображения аргументов пользовательских блоков", + "block-switching/@settings-name-data": "Блоки переменных", + "block-switching/@settings-name-event": "Блоки событий", + "block-switching/@settings-name-extension": "Блоки расширений", + "block-switching/@settings-name-looks": "Блоки внешности", + "block-switching/@settings-name-motion": "Блоки движения", + "block-switching/@settings-name-noop": "Показать вариант изменения блока на себя", + "block-switching/@settings-name-operator": "Блоки операторов", + "block-switching/@settings-name-sensing": "Блоки сенсоров", + "block-switching/@settings-name-sound": "Блоки звуков", + "block-switching/@settings-select-customargsmode-all": "Аргументы во всех пользовательских блоках спрайта", + "block-switching/@settings-select-customargsmode-defOnly": "Аргументы в собственном пользовательском блоке", + "load-extensions/@description": "Автоматически добавляет расширения Музыка, Перо и др. в меню категорий блоков в редакторе.", + "load-extensions/@name": "Автоматически добавлять расширения", + "load-extensions/@settings-name-music": "Музыка", + "load-extensions/@settings-name-pen": "Перо", + "load-extensions/@settings-name-text2speech": "Текст в речь", + "load-extensions/@settings-name-translate": "Перевод", + "custom-zoom/@description": "Выберите свои настройки максимального размера,минимального,скорость,и начальное увеличение зоны с кодом\nа также,автоскрытие управления.", + "custom-zoom/@name": "Настраиваемое масштабирование области кода", + "custom-zoom/@settings-name-autohide": "Автоматическое скрытие элементов управления масштабированием", + "custom-zoom/@settings-name-maxZoom": "Максимальное увеличение (100-500%)", + "custom-zoom/@settings-name-minZoom": "Минимальное увеличение (1-100%)", + "custom-zoom/@settings-name-speed": "Скорость анимации скрытия", + "custom-zoom/@settings-name-startZoom": "Начальное увеличение (50-500%)", + "custom-zoom/@settings-name-zoomSpeed": "Скорость увеличения (50-200%)", + "custom-zoom/@settings-select-speed-default": "По умолчанию", + "custom-zoom/@settings-select-speed-long": "Медленная", + "custom-zoom/@settings-select-speed-none": "Моментальная", + "custom-zoom/@settings-select-speed-short": "Быстрая", + "initialise-sprite-position/@description": "Изменяет позицию x/y по умолчанию для новых спрайтов", + "initialise-sprite-position/@name": "Настраиваемая позиция нового спрайта", + "initialise-sprite-position/@settings-name-duplicate": "Поведение при дублировании спрайтов", + "initialise-sprite-position/@settings-name-library": "Случайное расположение спрайтов из библиотеки", + "initialise-sprite-position/@settings-name-x": "Позиция X", + "initialise-sprite-position/@settings-name-y": "Позиция Y", + "initialise-sprite-position/@settings-select-duplicate-custom": "Определённые значения x/y", + "initialise-sprite-position/@settings-select-duplicate-keep": "Те же,что и у оригинального спрайта", + "initialise-sprite-position/@settings-select-duplicate-randomize": "Случайные", + "blocks2image/@description": "Кликните правой кнопкой мыши в область кода, чтобы экспортировать блоки как изображения SVG или PNG.", + "blocks2image/@name": "Сохранить блоки как изображение", + "remove-curved-stage-border/@description": "Убирает фигурную обводку вокруг сцены, позволяя увидеть углы.", + "remove-curved-stage-border/@name": "Убирает фигурную обводку сцены", + "transparent-orphans/@description": "Добавляет прозрачность блокам в редакторе,с отдельными опциями для отдельных блоков(которые без блока действий),и блоков которые перетаскиваются", + "transparent-orphans/@name": "Прозрачность блоков", + "transparent-orphans/@settings-name-block": "Прозрачность блоков (%)", + "transparent-orphans/@settings-name-dragged": "прозрачность перетаскиваемых блоков (%)", + "transparent-orphans/@settings-name-orphan": "прозрачность отдельных блоков (%)", + "paint-by-default/@description": "Изменяет действие по умолчанию кнопок «выберите спрайт/костюм/фон/звук», которые по умолчанию открывают библиотеку.", + "paint-by-default/@name": "Рисовать костюм по умолчанию", + "paint-by-default/@settings-name-backdrop": "Добавить фон", + "paint-by-default/@settings-name-costume": "Добавить костюм", + "paint-by-default/@settings-name-sound": "Добавить звук", + "paint-by-default/@settings-name-sprite": "Добавить спрайт", + "paint-by-default/@settings-select-backdrop-library": "Библиотека", + "paint-by-default/@settings-select-backdrop-paint": "Нарисовать", + "paint-by-default/@settings-select-backdrop-surprise": "Сюрприз", + "paint-by-default/@settings-select-backdrop-upload": "Загрузить", + "paint-by-default/@settings-select-costume-library": "Библиотека", + "paint-by-default/@settings-select-costume-paint": "Нарисовать", + "paint-by-default/@settings-select-costume-surprise": "Сюрприз", + "paint-by-default/@settings-select-costume-upload": "Загрузить", + "paint-by-default/@settings-select-sound-library": "Библиотека", + "paint-by-default/@settings-select-sound-record": "Записать", + "paint-by-default/@settings-select-sound-surprise": "Сюрприз", + "paint-by-default/@settings-select-sound-upload": "Загрузить", + "paint-by-default/@settings-select-sprite-library": "Библиотека", + "paint-by-default/@settings-select-sprite-paint": "Нарисовать", + "paint-by-default/@settings-select-sprite-surprise": "Сюрприз", + "paint-by-default/@settings-select-sprite-upload": "Загрузить", + "block-cherry-picking/@description": "Позволяет перемещать один блок из середины скрипта (вместо всей стопки, прикреплённая снизу блока) с помощью зажатия клавиши Ctrl.", + "block-cherry-picking/@info-flipControls": "Если «инвертировать управление» включено, то будет браться один блок. Зажимайте Ctrl, чтобы переместить целую стопку.", + "block-cherry-picking/@info-macContextDisabled": "В macOS используйте клавишу Cmd вместо Ctrl.", + "block-cherry-picking/@name": "Вытаскивать отдельный блок с клавишей Ctrl", + "block-cherry-picking/@settings-name-invertDrag": "Инвертировать управление", + "hide-new-variables/@description": "Не создавать мониторы автоматически для новых переменных или списков.", + "hide-new-variables/@name": "Скрывать новые переменные", + "editor-extra-keys/@description": "Добавляет больше клавиш в выпадающие списки блоков \"клавиша () нажата?\" и \"когда клавиша () нажата\", такие как Enter, точка, запятая и другие.", + "editor-extra-keys/@info-experimentalKeysWarn": "«Экспериментальные клавиши» включают в себя равно, слэш, двоеточие и многое другое. Они могут не работать на всех операционных системах или раскладках клавиатуры.", + "editor-extra-keys/@info-shiftKeysWarn": "«Клавиши Shift» включают в себя клавиши, которым нужна клавиша Shift и клавиша цифры по типу хэштега, вопросительного знака и многое др. Эти клавиши работают только с блоком «когда клавиша () нажата» и не работают на всех операционных системах или раскладках клавиатуры.", + "editor-extra-keys/@name": "Дополнительные опции клавиш", + "editor-extra-keys/@settings-name-experimentalKeys": "Включить экспериментальные клавиши", + "editor-extra-keys/@settings-name-shiftKeys": "Включить кнопки Shift", + "hide-delete-button/@description": "Скрывает кнопку удаления (иконка корзины) из спрайтов, костюмов и звуков. Они могут быть удалены из контекстного меню.", + "hide-delete-button/@name": "Скрыть кнопку удалить", + "hide-delete-button/@settings-name-costumes": "Костюмы и фоны", + "hide-delete-button/@settings-name-sounds": "Звуки", + "hide-delete-button/@settings-name-sprites": "Спрайты", + "no-script-bumping/@description": "Позволяет скриптам двигаться и изменяться без их перекрытия для перемещения вокруг.", + "no-script-bumping/@name": "Не делать автоматически пробел между перекрывающими скриптами", + "disable-stage-drag-select/@description": "Удаляет возможность перетаскивать спрайты по сцене в редакторе, за исключением тех, которые установлены как перетаскиваемые. Удерживайте Shift при перетаскивании спрайта, чтобы переместить его в обычном режиме.", + "disable-stage-drag-select/@name": "Неперетаскиваемые спрайты в редакторе", + "move-to-top-bottom/@description": "Добавляет новый пункт в контекстное меню костюма или звука, позволяющее переместить его наверх или вниз", + "move-to-top-bottom/@info-developer-tools": "Этот аддон раньше был частью \"инструментов разработчика\" ,но теперь переехал сюда", + "move-to-top-bottom/@name": "Переместить костюм на самый вверх или в самый низ", + "disable-paste-offset/@description": "Вставляет скопированные предметы на их оригинальные позиции вместо слегка сдвинутого в редакторе костюмов.", + "disable-paste-offset/@info-vanilla": "Это можно получить и без аддона, нажав alt+клик по объекту", + "disable-paste-offset/@name": "Не двигать вставленные предметы в редакторе костюмов", + "block-duplicate/@description": "Быстро дублирует скрипт, зажимая клавишу Alt и передвигая скрипт. Также зажимайте Ctrl, чтобы дублировать один блок.", + "block-duplicate/@info-mac": "Если у Вас macOS, то используйте клавишу ⌥, вместо Alt и клавишу ⌘, вместо Control.", + "block-duplicate/@name": "Дублировать скрипт с клавишей Alt", + "rename-broadcasts/@description": "Позволяет изменять названия сообщений в блоках их передачи и получения", + "rename-broadcasts/@name": "Переименовать сообщения", + "swap-local-global/@description": "Добавляет больше опций во время переименования существующей переменной или существующего списка: позволяет переключаться между «Для всех спрайтов», «Только для этого спрайта» и облачными переменными. Также добавляет новую опцию при нажатии правой кнопкой мыши по переменной/списку, чтобы быстро сменить свойства.", + "swap-local-global/@name": "Переключить переменные между «Для всех спрайтов» и «Только для этого спрайта»", + "editor-comment-previews/@description": "Позволяет делать превью комментариев, наводя на свёрнутые комментарии и блоки. Вы можете использовать это, чтобы просматривать комментарии, которые вне экрана, определять блок цикла снизу с помощью превью, вместить длинные комментарии в маленькое место и другое.", + "editor-comment-previews/@name": "Предварительный просмотр комментариев в редакторе", + "editor-comment-previews/@settings-name-delay": "Ожидание", + "editor-comment-previews/@settings-name-follow-mouse": "Наблюдать за указателем мыши", + "editor-comment-previews/@settings-name-hover-view": "Раскрывать комментарии, наводя на них", + "editor-comment-previews/@settings-name-hover-view-block": "Раскрыть прикреплённые комментарии у блоков, наводя на них", + "editor-comment-previews/@settings-name-hover-view-procedure": "Показывать комментарии у других блоков, наводя на комментарии", + "editor-comment-previews/@settings-name-reduce-animation": "Ослабить анимацию", + "editor-comment-previews/@settings-name-reduce-transparency": "Уменьшить прозрачность", + "editor-comment-previews/@settings-select-delay-long": "Длинное", + "editor-comment-previews/@settings-select-delay-none": "Никакое", + "editor-comment-previews/@settings-select-delay-short": "Короткое", + "columns/@description": "Разделяет меню категорий блоков на два столбца и перемещает его в верхнюю часть палитры блоков, как в Scratch 2.0.", + "columns/@name": "Меню категорий с двумя столбцами", + "number-pad/@description": "Показывает панель ввода ,при редактировании чисел , на всех устройствах ,а не только на сенсорных", + "number-pad/@info-explanation": "Панель с цифрами будет показываться при редактировании чисел в блоках ,таких как \"установить x в\"", + "number-pad/@name": "Всегда показывать панель с цифрами", + "script-snap/@description": "Передвиньте скрипт, чтобы автоматически выравнять его позицию к точкам на территории кода.", + "script-snap/@name": "Привязывать скрипты к сетке", + "script-snap/@preset-name-default": "По умолчанию", + "script-snap/@preset-name-half-block": "Половина блока", + "script-snap/@preset-name-whole-block": "Весь блок", + "script-snap/@settings-name-grid": "Размер сетки (в пикселях)", + "fullscreen/@description": "Исправляет некоторые неблагоприятные эффекты в полноэкранном режиме плеере проекта, открывает его в полноэкранном режиме Вашего браузера и прячет панель инструментов зелёного флажка.", + "fullscreen/@info-hideToolbarNotice": "Если Вы спрячете панель инструментов, то не забывайте, что Вы можете нажать клавишу Esc, чтобы выйти из полноэкранного режима проекта.", + "fullscreen/@name": "Улучшенный полноэкранный режим", + "fullscreen/@settings-name-browserFullscreen": "Открывать полноэкранный режим плеера проектов в полноэкранном режиме браузера", + "fullscreen/@settings-name-hideToolbar": "Спрятать панель инструментов в полном экране", + "hide-stage/@description": "Добавляет кнопку рядом с кнопками \"маленькая сцена\" и \"большая сцена\", которая скрывает сцену и область спрайтов, делая область кода намного больше.", + "hide-stage/@name": "Скрыть сцену и область спрайтов", + "editor-stepping/@description": "Добавляет цветную подсветку к блокам, которые в данный момент выполняются в проекте.", + "editor-stepping/@name": "Выделять выполняемые в данный момент блоки", + "editor-stepping/@settings-name-highlight-color": "Цвет подсветки" +} \ No newline at end of file diff --git a/src/addons/addons-l10n-settings/sl.json b/src/addons/addons-l10n-settings/sl.json new file mode 100644 index 0000000000000000000000000000000000000000..0af2ccc195248848e439be4bd8a0b7b8af82994d --- /dev/null +++ b/src/addons/addons-l10n-settings/sl.json @@ -0,0 +1,321 @@ +{ + "cat-blocks/@description": "Vrne mačje bloke iz 1. aprila 2020 v urejevalnik.", + "cat-blocks/@info-watch": "Nastavitev \"spremljaj kazalec miške\" lahko vpliva na hitrost delovanja urejevalnika.", + "cat-blocks/@name": "Mačji bloki", + "cat-blocks/@settings-name-watch": "Spremljaj kazalec miške", + "editor-devtools/@description": "V menije v urejevalniku doda nove možnosti: kopiranje blokov, boljše čiščenje in drugo.", + "editor-devtools/@name": "Orodje za razvijalce", + "editor-devtools/@settings-name-enableCleanUpPlus": "Izboljšaj možnost \"Počisti bloke\"", + "editor-devtools/@settings-name-enablePasteBlocksAtMouse": "Prilepi bloke poleg kazalca miške", + "find-bar/@description": "Poleg zavihka Zvoki doda vrstico, s katero lahko poiščete in se premaknete na skripto, videz ali zvok. Uporabite Ctrl+levo ali Ctrl+desno v prostoru za kodo, da se premaknete na prejšnji ali naslednji položaj.", + "find-bar/@info-developer-tools": "Ta funkcija je bila prej del dodatka \"orodje za razvijalce\", vendar smo jo premaknili sem.", + "find-bar/@name": "Iskalna vrstica v urejevalniku", + "middle-click-popup/@info-developer-tools": "Ta funkcija je bila prej del dodatka \"orodje za razvijalce\", vendar smo jo premaknili sem.", + "jump-to-def/@description": "Omogoča, da se premaknete na definicijo \"mojega bloka\" s srednjim miškinim gumbom ali Shift+klikom.", + "jump-to-def/@info-developer-tools": "Ta funkcija je bila prej del dodatka \"orodje za razvijalce\", vendar smo jo premaknili sem.", + "jump-to-def/@name": "Skoči na definicijo \"mojega bloka\"", + "editor-searchable-dropdowns/@description": "Omogoči iskanje po spustnih menijih blokov.", + "editor-searchable-dropdowns/@name": "Iskanje po spustnih menijih", + "data-category-tweaks-v2/@description": "Izboljša kategorijo blokov Podatki (\"Spremenljivke\").", + "data-category-tweaks-v2/@name": "Izboljšana kategorija spremenljivk", + "data-category-tweaks-v2/@settings-name-moveReportersDown": "Premakni bloke za podatke nad seznam spremenljivk", + "data-category-tweaks-v2/@settings-name-separateListCategory": "Ločena kategorija za sezname", + "data-category-tweaks-v2/@settings-name-separateLocalVariables": "Ločene spremenljivke samo za to figuro", + "block-palette-icons/@description": "V barvne kroge, ki označujejo kategorije blokov, doda ikone.", + "block-palette-icons/@name": "Ikone kategorij blokov", + "hide-flyout/@description": "Skrije paleto blokov, če miška ni na njej. Kliknite ikono ključavnice, da jo začasno zaklenete. Lahko pa uporabite tudi način \"Ko kliknem kategorijo\".", + "hide-flyout/@info-hoverExplanation": "Način \"ko premaknem miško na območje palete\" poveča samo območje, v katerem so bloki vidni. Če želite tja vleči bloke, ne da bi bili ti izbrisani, uporabite enega od drugih načinov.", + "hide-flyout/@name": "Samodejno skrivanje palete blokov", + "hide-flyout/@settings-name-speed": "Hitrost animacije", + "hide-flyout/@settings-name-toggle": "Pokaži ko...", + "hide-flyout/@settings-select-speed-default": "Navadna", + "hide-flyout/@settings-select-speed-long": "Počasna", + "hide-flyout/@settings-select-speed-none": "Trenutna", + "hide-flyout/@settings-select-speed-short": "Hitra", + "hide-flyout/@settings-select-toggle-category": "Kliknem kategorijo", + "hide-flyout/@settings-select-toggle-cathover": "Premaknem miško na kategorijo", + "hide-flyout/@settings-select-toggle-hover": "Premaknem miško na območje palete", + "hide-flyout/@update": "Ta dodatek je bil izboljšan in veliko napak je bilo popravljenih.", + "mediarecorder/@description": "V menijsko vrstico v urejevalniku doda gumb \"začni snemanje\", ki omogoča snemanje odra.", + "mediarecorder/@name": "Snemanje videov projekta", + "drag-drop/@description": "Omogoča vlečenje slik in zvokov iz vašega upravitelja datotek v seznam figur, videzov ali zvokov. Lahko povlečete tudi besedilne datoteke v sezname ali v polje, ki ga prikaže blok \"vprašaj in počakaj\".", + "drag-drop/@name": "Vlečenje datotek v urejevalnik", + "drag-drop/@settings-name-use-hd-upload": "Uporabi HD nalaganje slik", + "debugger/@name": "Orodje za razhroščevanje", + "debugger/@settings-name-log_broadcasts": "Zapiši objave", + "debugger/@settings-name-log_clear_greenflag": "Izprazni zapiske, ko je kliknjena zelena zastavica", + "debugger/@settings-name-log_clone_create": "Zapiši sporočilo o ustvarjanju dvojnika", + "debugger/@settings-name-log_failed_clone_creation": "Zapiši sporočilo, ko je doseženo največje možno število dvojnikov", + "debugger/@settings-name-log_greenflag": "Zapiši klike na zeleno zastavico", + "debugger/@update": "Nova zavihka \"Niti\" in \"Učinkovitost\" v oknu za razhroščevanje.", + "pause/@description": "Doda gumb za premor poleg zelene zastavice.", + "pause/@name": "Gumb za premor", + "mute-project/@description": "Ctrl+kliknite zeleno zastavico, da vključite ali izključite zvok v projektu.", + "mute-project/@info-macOS": "Če uporabljate macOS, uporabite tipko Cmd namesto Ctrl.", + "mute-project/@name": "Utišaj predvajalnik projekta", + "vol-slider/@description": "Doda drsnik za glasnost poleg gumbov za nadzor projekta.", + "vol-slider/@name": "Drsnik za glasnost projekta", + "vol-slider/@settings-name-defVol": "Začetna glasnost", + "clones/@description": "Nad oder v urejevalniku doda števec, ki prikaže skupno število dvojnikov figur.", + "clones/@name": "Števec dvojnikov", + "clones/@settings-name-showicononly": "Pokaži samo ikono", + "mouse-pos/@description": "Prikaže x/y položaj miške nad odrom v urejevalniku.", + "mouse-pos/@name": "Položaj miške", + "color-picker/@description": "Doda polje za vnos šestnajstiške kode, ko izbirate barvo.", + "color-picker/@name": "Šestnajstiške barve", + "remove-sprite-confirm/@description": "Vpraša, če ste prepričani, preden izbrišete figuro v projektu.", + "remove-sprite-confirm/@name": "Potrditev brisanja figure", + "block-count/@description": "Pokaže skupno število blokov v projektu v menijski vrstici urejevalnika. Prej del dodatka \"število figur in skript\".", + "block-count/@name": "Števec blokov", + "onion-skinning/@description": "Pokaže prosojne slike prejšnjih ali naslednjih videzov med urejanjem videza. Za upravljanje uporabite gumbe pod urejevalnikom videzov poleg gumbov za povečavo.", + "onion-skinning/@settings-name-afterTint": "Barva naslednjega videza", + "onion-skinning/@settings-name-beforeTint": "Barva prejšnjega videza", + "onion-skinning/@settings-name-default": "Samodejno vključi", + "onion-skinning/@settings-name-layering": "Začetna plast", + "onion-skinning/@settings-name-mode": "Začetni način", + "onion-skinning/@settings-name-next": "Začetno število naslednjih videzov", + "onion-skinning/@settings-name-opacity": "Neprosojnost (%)", + "onion-skinning/@settings-name-opacityStep": "Sprememba neprosojnosti (%)", + "onion-skinning/@settings-name-previous": "Začetno število prejšnjih videzov", + "onion-skinning/@settings-select-layering-behind": "Zadaj", + "onion-skinning/@settings-select-layering-front": "Spredaj", + "onion-skinning/@settings-select-mode-merge": "Združi slike", + "onion-skinning/@settings-select-mode-tint": "Barva", + "default-costume-editor-color/@description": "Spremeni privzete barve in velikost robov v urejevalniku videzov.", + "default-costume-editor-color/@name": "Prilagoditev privzetih barv v urejevalniku videzov", + "default-costume-editor-color/@settings-name-fill": "Barva polnila", + "default-costume-editor-color/@settings-name-persistence": "Pri zamenjavi orodja uporabi prejšnje barve namesto privzetih", + "default-costume-editor-color/@settings-name-stroke": "Barva robov", + "default-costume-editor-color/@settings-name-strokeSize": "Velikost robov", + "bitmap-copy/@description": "Omogoči, da kopirate bitno sliko iz urejevalnika videzov v sistemsko odložišče in jo prilepite v druge spletne strani ali programe.", + "bitmap-copy/@info-norightclick": "\"Desni miškin gumb → kopiraj\" ne deluje. Pritisnite morati Ctrl+C, ko je izbrana bitna slika.", + "bitmap-copy/@name": "Kopiranje bitnih slik", + "2d-color-picker/@description": "Zamenja drsnika za svetlost in nasičenost barv v urejevalniku videzov z 2D drsnikom. Držite tipko Shift med vlečenjem, da spremenite samo vrednost ene osi.", + "2d-color-picker/@name": "2D izbira barv", + "better-img-uploads/@description": "Doda nov gumb nad \"naloži videz\", ki samodejno spremeni naložene slike v obliko SVG (vektor), da se izogne zmanjšanju kakovosti.", + "better-img-uploads/@info-notSuitableEdit": "Gumba \"naloži HD\" ne uporabljajte, če bi radi naloženo sliko urejali.", + "better-img-uploads/@name": "Nalaganje HD slik", + "better-img-uploads/@settings-name-fitting": "Velikost slike", + "better-img-uploads/@settings-select-fitting-fill": "Raztegni na velikost odra", + "better-img-uploads/@settings-select-fitting-fit": "Pomanjšaj prevelike slike do velikosti odra", + "better-img-uploads/@settings-select-fitting-full": "Izvirna velikost", + "pick-colors-from-stage/@description": "Omogoči, da s kapalko v urejevalniku videzov izberete tudi barve iz odra.", + "pick-colors-from-stage/@name": "Izberi barve iz odra v urejevalniku videzov", + "custom-block-shape/@description": "Spremenite velikost, zaobljenost robov in velikost zareze blokov.", + "custom-block-shape/@info-paddingWarning": "Spremembo velikosti praznega prostora vidite samo vi, zato se za druge uporabnike skripte v vašem projektu lahko prekrivajo.", + "custom-block-shape/@name": "Prilagoditev oblike blokov", + "custom-block-shape/@preset-description-default2": "Videz, podoben blokom v Scratchu 2.0", + "custom-block-shape/@preset-description-default3": "Običajni videz blokov v Scratchu 3.0", + "custom-block-shape/@preset-description-flat2": "Bloki Scratcha 2.0 brez zarez in zaobljenih robov.", + "custom-block-shape/@preset-description-flat3": "Bloki Scratcha 3.0 brez zarez in zaobljenih robov.", + "custom-block-shape/@preset-name-default2": "2.0 bloki", + "custom-block-shape/@preset-name-default3": "3.0 bloki", + "custom-block-shape/@preset-name-flat2": "2.0 ravni bloki", + "custom-block-shape/@preset-name-flat3": "3.0 ravni bloki", + "custom-block-shape/@settings-name-cornerSize": "Zaobljenost robov (0-300%)", + "custom-block-shape/@settings-name-notchSize": "Višina zareze (0-150%)", + "custom-block-shape/@settings-name-paddingSize": "Velikost praznega prostora (50-200%)", + "zebra-striping/@description": "Bloke iste kategorije pobarva izmenično s svetlejšimi in temnejšimi odtenki, kadar so postavljeni drug v drugega. To se imenuje tudi zebrine proge.", + "zebra-striping/@name": "Izmenično obarvani ugnezdeni bloki", + "zebra-striping/@settings-name-intensity": "Intenzivnost (0-100%)", + "zebra-striping/@settings-name-shade": "Odtenek", + "zebra-striping/@settings-select-shade-darker": "Temnejši", + "zebra-striping/@settings-select-shade-lighter": "Svetlejši", + "editor-theme3/@description": "Uredite barve blokov za vsako kategorijo v urejevalniku.", + "editor-theme3/@name": "Prilagoditev barv blokov", + "editor-theme3/@preset-description-black": "Naredi ozadje blokov črno", + "editor-theme3/@preset-description-dark": "Temne različice običajnih barv", + "editor-theme3/@preset-description-original": "Originalne barve blokov iz Scratcha 2.0", + "editor-theme3/@preset-description-tweaks": "Bloki za dogodke, krmiljenje in \"moji bloki\" z barvami, podobnimi kot v Scratchu 2.0", + "editor-theme3/@preset-name-black": "Črno", + "editor-theme3/@preset-name-dark": "Temno", + "editor-theme3/@preset-name-original": "Barve Scratcha 2.0", + "editor-theme3/@preset-name-tweaks": "Izboljšane barve Scratcha 3.0", + "editor-theme3/@settings-name-Pen-color": "razširitve", + "editor-theme3/@settings-name-comment-color": "Komentarji", + "editor-theme3/@settings-name-control-color": "krmiljenje", + "editor-theme3/@settings-name-custom-color": "moji bloki", + "editor-theme3/@settings-name-data-color": "spremenljivke", + "editor-theme3/@settings-name-data-lists-color": "seznami", + "editor-theme3/@settings-name-events-color": "dogodki", + "editor-theme3/@settings-name-input-color": "Vnosna polja blokov", + "editor-theme3/@settings-name-looks-color": "videzi", + "editor-theme3/@settings-name-motion-color": "gibanje", + "editor-theme3/@settings-name-operators-color": "operatorji", + "editor-theme3/@settings-name-sensing-color": "zaznavanje", + "editor-theme3/@settings-name-sounds-color": "zvok", + "editor-theme3/@settings-name-text": "Barva besedila", + "editor-theme3/@settings-select-text-black": "Črna", + "editor-theme3/@settings-select-text-colorOnBlack": "Barva na črnem ozadju", + "editor-theme3/@settings-select-text-colorOnWhite": "Barva na belem ozadju", + "editor-theme3/@settings-select-text-white": "Bela", + "editor-theme3/@update": "Nastavitev \"Temni komentarji\" smo iz dodatka \"Temni način in prilagoditev barv v urejevalniku\" smo premaknili sem. Zdaj lahko spremenite tudi barvo komentarjev.", + "custom-block-text/@description": "Spremeni debelino besedila na blokih, lahko pa doda tudi senco.", + "custom-block-text/@name": "Prilagoditev sloga besedila blokov", + "custom-block-text/@settings-name-bold": "Krepko besedilo", + "custom-block-text/@settings-name-shadow": "Senca pod besedilom", + "editor-colored-context-menus/@description": "Naredi menije, ki se odprejo, ko kliknete blok z desno miškino tipko, barvne.", + "editor-colored-context-menus/@name": "Barvni meniji", + "editor-stage-left/@description": "Premakne oder na levo stran urejevalnika, kot v Scratchu 2.0.", + "editor-stage-left/@info-reverseOrder": "Če bi radi spremenili položaj gumbov nad odrom, uporabite dodatek \"obratno zaporedje gumbov za nadzor projekta\".", + "editor-stage-left/@name": "Pokaži oder na levi strani", + "editor-buttons-reverse-order/@description": "Premakne zeleno zastavico in gumb Ustavi na desno in gumb za celozaslonski način na desno, kot v Scratchu 2.0.", + "editor-buttons-reverse-order/@name": "Obratno zaporedje gumbov za nadzor projekta", + "variable-manager/@description": "Doda zavihek za enostavno urejanje spremenljivk in seznamov v urejevalnik, poleg zavihka \"zvoki\".", + "variable-manager/@name": "Upravitelj spremenljivk", + "variable-manager/@update": "Za dodajanje predmetov v sezname ni več treba držati tipke Shift.", + "search-sprites/@description": "Poleg seznama figur doda polje za iskanje figur glede na ime.", + "search-sprites/@name": "Išči figure po imenu", + "sprite-properties/@settings-name-transitionDuration": "Hitrost animacije", + "sprite-properties/@settings-select-transitionDuration-default": "Navadna", + "sprite-properties/@settings-select-transitionDuration-long": "Počasna", + "sprite-properties/@settings-select-transitionDuration-none": "Trenutna", + "sprite-properties/@settings-select-transitionDuration-short": "Hitra", + "gamepad/@description": "Uporabljajte USB ali Bluetooth igralni plošček v projektih.", + "gamepad/@name": "Podpora igralnih ploščkov", + "gamepad/@settings-name-hide": "Skrij gumb za nastavitve, ko noben plošček ni zaznan", + "editor-sounds/@description": "Doda zvočne učnike, ko povežete ali izbrišete bloke.", + "editor-sounds/@name": "Zvočni učinki v urejevalniku", + "folders/@description": "Doda mape v sezname figur, videzov in zvokov. Kliknite figuro z desno miškino tipko in izberite \"ustvari mapo\", da naredite novo mapo. Kliknite mapo, da jo odprete ali zaprete. Kliknite figuro z desno tipko, da jo dodate v mapo, ali pa jo z miško povlecite v odprto mapo. Ta dodatek deluje tako, da na začetek imena figure doda \"[imeMape]//\".", + "folders/@info-notice-folders-are-public": "Uporabniki, ki imajo to možnost vključeno, bodo lahko videli mape v vašem projektu. Drugi uporabniki bodo videli seznam figur na običajen način (brez map).", + "folders/@name": "Mape figur", + "block-switching/@description": "Kliknite na blok z desno miškino tipko, da ga zamenjate s podobnim blokom.", + "block-switching/@name": "Menjava blokov", + "block-switching/@settings-name-control": "Bloki za krmiljenje", + "block-switching/@settings-name-customargs": "Vnosi \"mojih blokov\"", + "block-switching/@settings-name-customargsmode": "Možnosti za vnose \"mojih blokov\"", + "block-switching/@settings-name-data": "Bloki za podatke", + "block-switching/@settings-name-event": "Bloki za dogodke", + "block-switching/@settings-name-extension": "Bloki razširitev", + "block-switching/@settings-name-looks": "Bloki za videz", + "block-switching/@settings-name-motion": "Bloki za gibanje", + "block-switching/@settings-name-noop": "Pokaži možnost, da bloka ne spremenim", + "block-switching/@settings-name-operator": "Operatorji", + "block-switching/@settings-name-sensing": "Bloki za zaznavanje", + "block-switching/@settings-name-sound": "Bloki za zvok", + "block-switching/@settings-select-customargsmode-all": "Vnosi vseh \"mojih blokov\" v figuri", + "block-switching/@settings-select-customargsmode-defOnly": "Vnosi ustreznega \"mojega bloka\"", + "load-extensions/@description": "Samodejno pokaže glasbo, svinčnik in druge razširitve na seznamu kategorij blokov v urejevalniku.", + "load-extensions/@name": "Samodejno dodaj razširitve", + "load-extensions/@settings-name-music": "Glasba", + "load-extensions/@settings-name-pen": "Svinčnik", + "load-extensions/@settings-name-text2speech": "Besedilo v govor", + "load-extensions/@settings-name-translate": "Prevedi", + "custom-zoom/@description": "Izberite najmanjšo in največjo povečavo ter hitrost in začetno vrednost povečave prostora za kodo. Lahko tudi samodejno skrije gumbe za povečavo.", + "custom-zoom/@name": "Prilagoditev povečave prostora za kodo", + "custom-zoom/@settings-name-autohide": "Samodejno skrij gumbe za povečavo", + "custom-zoom/@settings-name-maxZoom": "Največja povečava (100-500%)", + "custom-zoom/@settings-name-minZoom": "Najmanjša povečava (1-100%)", + "custom-zoom/@settings-name-speed": "Hitrost animacije skrivanja gumbov", + "custom-zoom/@settings-name-startZoom": "Začetna povečava (50-500%)", + "custom-zoom/@settings-name-zoomSpeed": "Hitrost povečave (50-200%)", + "custom-zoom/@settings-select-speed-default": "Navadno", + "custom-zoom/@settings-select-speed-long": "Počasna", + "custom-zoom/@settings-select-speed-none": "Trenutna", + "custom-zoom/@settings-select-speed-short": "Hitra", + "initialise-sprite-position/@description": "Spremeni začetni položaj x/y novih figur.", + "initialise-sprite-position/@name": "Prilagoditev položaja novih figur", + "initialise-sprite-position/@settings-name-duplicate": "Podvajanje figur", + "initialise-sprite-position/@settings-name-library": "Postavi figure iz knjižnice na naključno mesto", + "initialise-sprite-position/@settings-name-x": "Položaj X", + "initialise-sprite-position/@settings-name-y": "Položaj Y", + "initialise-sprite-position/@settings-select-duplicate-custom": "Pošlji na določene vrednosti x/y", + "initialise-sprite-position/@settings-select-duplicate-keep": "Ohrani položaj originalne figure", + "initialise-sprite-position/@settings-select-duplicate-randomize": "Naključen položaj", + "blocks2image/@description": "Kliknite prostor za kodo z desno miškino tipko, da izvozite bloke kot sliko SVG ali PNG.", + "blocks2image/@name": "Shrani bloke kot sliko", + "remove-curved-stage-border/@description": "Odstrani zaobljen okvir odra in s tem naredi robove vidne.", + "remove-curved-stage-border/@name": "Odstrani zaobljen okvir odra", + "transparent-orphans/@description": "Prilagodi prosojnost blokov v urejevalniku, z ločenima možnostma za neuporabljene bloke (tiste, ki niso povezani z dogodkom) in bloke, ki jih vlečete z miško.", + "transparent-orphans/@name": "Prosojnost blokov", + "transparent-orphans/@settings-name-block": "Prosojnost blokov (%)", + "transparent-orphans/@settings-name-dragged": "Prosojnost blokov med vlečenjem (%)", + "transparent-orphans/@settings-name-orphan": "Prosojnost neuporabljenih blokov (%)", + "paint-by-default/@description": "Spremeni gumbe \"Izberi figuro/videz/ozadje/zvok\", da namesto odpiranja knjižnice naredijo kaj drugega.", + "paint-by-default/@name": "Odpri urejevalnik videzov namesto knjižnice", + "paint-by-default/@settings-name-backdrop": "Dodajanje ozadja", + "paint-by-default/@settings-name-costume": "Dodajanje videza", + "paint-by-default/@settings-name-sound": "Dodajanje zvoka", + "paint-by-default/@settings-name-sprite": "Dodajanje figure", + "paint-by-default/@settings-select-backdrop-library": "Knjižnica", + "paint-by-default/@settings-select-backdrop-paint": "Nariši", + "paint-by-default/@settings-select-backdrop-surprise": "Presenečenje", + "paint-by-default/@settings-select-backdrop-upload": "Naloži", + "paint-by-default/@settings-select-costume-library": "Knjižnica", + "paint-by-default/@settings-select-costume-paint": "Nariši", + "paint-by-default/@settings-select-costume-surprise": "Presenečenje", + "paint-by-default/@settings-select-costume-upload": "Naloži", + "paint-by-default/@settings-select-sound-library": "Knjižnica", + "paint-by-default/@settings-select-sound-record": "Snemaj", + "paint-by-default/@settings-select-sound-surprise": "Presenečenje", + "paint-by-default/@settings-select-sound-upload": "Naloži", + "paint-by-default/@settings-select-sprite-library": "Knjižnica", + "paint-by-default/@settings-select-sprite-paint": "Nariši", + "paint-by-default/@settings-select-sprite-surprise": "Presenečenje", + "paint-by-default/@settings-select-sprite-upload": "Naloži", + "block-cherry-picking/@description": "Doda možnost, da iz sredine skripte potegnete en sam blok (namesto vseh blokov pod njim), medtem ko držite tipko Ctrl.", + "block-cherry-picking/@info-flipControls": "Če je vključena nastavitev \"zamenjaj dejanje tipke\", vlečenje vedno premakne le en blok. Držite Ctrl, da premaknete celo zaporedje blokov.", + "block-cherry-picking/@info-macContextDisabled": "Če uporabljate macOS, uporabite tipko Cmd namesto Ctrl.", + "block-cherry-picking/@name": "Vleci posamezne bloke s tipko Ctrl", + "block-cherry-picking/@settings-name-invertDrag": "Zamenjaj dejanje tipke", + "hide-new-variables/@description": "Na novo ustvarjenih spremenljivk in seznamov ne pokaže na odru.", + "hide-new-variables/@name": "Skrij nove spremenljivke", + "editor-extra-keys/@description": "V spustni meni blokov \"je pritisnjena tipka ()?\" in \"ko je tipka () pritisnjena\" doda več tipk, na primer Enter, piko, vejico in druge. Tudi uporabniki, ki nimajo tega dodatka, bodo lahko uporabljali te tipke.", + "editor-extra-keys/@info-experimentalKeysWarn": "\"Poskusne tipke\" so enačaj, poševnica, podpičje in druge. Morda ne bodo delovale v vseh operacijskih sistemih in na vseh tipkovnicah.", + "editor-extra-keys/@info-shiftKeysWarn": "\"Tipke Shift\" so znaki, ki se jih običajno vnese s tipko Shift in tipko za številko, na primer #, ! in druge. Te tipke delujejo samo v bloku \"ko je tipka () pritisnjena\" in ne delujejo v vseh operacijskih sistemih in na vseh tipkovnicah.", + "editor-extra-keys/@name": "Dodatne tipke", + "editor-extra-keys/@settings-name-experimentalKeys": "Pokaži poskusne tipke", + "editor-extra-keys/@settings-name-shiftKeys": "Pokaži tipke Shift", + "hide-delete-button/@description": "Skrije gumb za izbris (ikona smetnjaka) figur, videzov in zvokov. Še vedno jih lahko izbrišite v meniju, ki se odpre, ko uporabite desno miškino tipko.", + "hide-delete-button/@name": "Skrij gumb za brisanje", + "hide-delete-button/@settings-name-costumes": "Videzi in ozadja", + "hide-delete-button/@settings-name-sounds": "Zvoki", + "hide-delete-button/@settings-name-sprites": "Figure", + "no-script-bumping/@description": "Omogoči premikanje in spreminjanje skript, ne da bi se pri tem premikale prekrivajoče se skripte.", + "no-script-bumping/@name": "Ne razmakni prekrivajočih se skript", + "disable-stage-drag-select/@description": "Odstrani možnost vlečenja figur na odru v urejevalniku, razen tistih, ki vlečenje omogočijo z ukazom \"možnost premika\". Med vlečenjem figure držite Shift, da jo premaknete na običajen način.", + "disable-stage-drag-select/@name": "Onemogoči vlečenje figur v urejevalniku", + "move-to-top-bottom/@description": "V meni desne miškine tipke za videze in zvoke doda možnost, ki predmet premakne na vrh ali na dno seznama.", + "move-to-top-bottom/@info-developer-tools": "Ta funkcija je bila prej del dodatka \"orodje za razvijalce\", vendar smo jo premaknili sem.", + "move-to-top-bottom/@name": "Premakni videz na vrh ali na dno", + "disable-paste-offset/@description": "V urejevalniku videzov kopiranih predmetov ne premakne, ampak jih prilepi na njihovem prejšnjem položaju.", + "disable-paste-offset/@name": "Ne premakni prilepljenih predmetov", + "block-duplicate/@description": "Hitro podvojite skripto tako, da jo potegnete, medtem ko držite tipko Alt. Držite tudi tipko Ctrl, da podvojite samo en block namesto vseh povezanih blokov.", + "block-duplicate/@info-mac": "Če uporabljate macOS, uporabite tipko Option namesto Alt in Command namesto Control.", + "block-duplicate/@name": "Podvoji skripto s tipko Alt", + "rename-broadcasts/@description": "V meni bloka \"objavi\" doda možnost za preimenovanje sporočila.", + "rename-broadcasts/@name": "Preimenovanje sporočil", + "swap-local-global/@description": "V okno za preimenovanje spremenljivke ali seznama doda več možnosti: omogoči spremembo spremenljivk \"Za vse figure\" v \"Samo za to figuro\" in obratno ter navadnih spremenljivk v spremenljivke v oblaku. Poleg tega doda novo možnost za hitro spremembo vidnosti, ko kliknete spremenljivko/seznam z desno miškino tipko.", + "swap-local-global/@name": "Zamenjaj spremenljivke \"za vse figure\" in \"samo za to figuro\"", + "editor-comment-previews/@description": "Pokaže vsebino komentarja, ko premaknete miško na skrčen komentar ali blok. To lahko uporabite na primer za branje komentarjev, ki na zaslonu niso vidni, prepoznavanje zanke na dnu s pomočjo komentarja in dodajanje več dolgih komentarjev v majhen prostor.", + "editor-comment-previews/@name": "Predogledi komentarjev v urejevalniku", + "editor-comment-previews/@settings-name-delay": "Zamik", + "editor-comment-previews/@settings-name-follow-mouse": "Sledi miški", + "editor-comment-previews/@settings-name-hover-view": "Pokaži vsebino skrčenih komentarjev", + "editor-comment-previews/@settings-name-hover-view-block": "Pokaži vsebino komentarja, ko premaknem miško na blok", + "editor-comment-previews/@settings-name-hover-view-procedure": "Pokaži komentar definicije, ko premaknem miško na \"moj blok\"", + "editor-comment-previews/@settings-name-reduce-animation": "Brez animacije", + "editor-comment-previews/@settings-name-reduce-transparency": "Zmanjšaj prosojnost", + "editor-comment-previews/@settings-select-delay-long": "Dolgo", + "editor-comment-previews/@settings-select-delay-none": "Brez", + "editor-comment-previews/@settings-select-delay-short": "Kratko", + "columns/@description": "Razdeli seznam kategorij blokov na dva stolpca in ga premakne na vrh palete blokov, kot v Scratchu 2.0.", + "columns/@name": "Seznam kategorij z dvema stolpcema", + "number-pad/@name": "Vedno pokaži številčnico", + "script-snap/@description": "Potegnite skripto, da se njen položaj samodejno poravna s pikami na ozadju prostora za skripte.", + "script-snap/@name": "Pritrdi skripte na mrežo", + "script-snap/@preset-name-default": "Navadno", + "script-snap/@preset-name-half-block": "Pol bloka", + "script-snap/@preset-name-whole-block": "Cel blok", + "script-snap/@settings-name-grid": "Velikost mreže (px)", + "fullscreen/@description": "Popravi nekatere težave v celozaslonskem načinu predvajalnika projektov, odpre projekte v celozaslonskem načinu brskalnika in skrije vrstico z zeleno zastavico.", + "fullscreen/@info-hideToolbarNotice": "Če skrijete orodno vrstico, ne pozabite, da lahko uporabite tipko Esc za izhod iz celozaslonskega načina predvajalnika.", + "fullscreen/@name": "Izboljšan celozaslonski način", + "fullscreen/@settings-name-browserFullscreen": "Odpri celozaslonski predvajalnik projekta v celozaslonskem načinu brskalnika", + "fullscreen/@settings-name-hideToolbar": "Skrij orodno vrstico v celozaslonskem načinu", + "hide-stage/@description": "Zraven gumbov \"manjši oder\" in \"večji oder\" doda gumb, ki skrije oder in seznam figur, kar zelo poveča prostor za kodo.", + "hide-stage/@name": "Skrij oder in seznam figur", + "editor-stepping/@description": "Doda barven okvir blokom, ki se v projektu trenutno izvajajo.", + "editor-stepping/@name": "Obroba trenutno delujočih blokov", + "editor-stepping/@settings-name-highlight-color": "Barva okvirja" +} \ No newline at end of file diff --git a/src/addons/addons-l10n-settings/tr.json b/src/addons/addons-l10n-settings/tr.json new file mode 100644 index 0000000000000000000000000000000000000000..4d87fe113ff2b7c83a34d5a13ea8c08616594025 --- /dev/null +++ b/src/addons/addons-l10n-settings/tr.json @@ -0,0 +1,345 @@ +{ + "cat-blocks/@description": "Bir Nisan Şaka Günü 2020'den şapkalı kedi bloklarını geri getirir.", + "cat-blocks/@info-watch": "\"Fare imlecini izle\" ayarı, düzenleyici açıkken performansı etkileyebilir.", + "cat-blocks/@name": "Kedi blokları", + "cat-blocks/@settings-name-watch": "Fare imlecini izle", + "editor-devtools/@description": "Düzenleyiciye yeni menü seçenekleri ekler: blokları kopyalama/yapıştırma, daha iyi çekidüzen verme ve çok daha fazlası!", + "editor-devtools/@name": "Geliştirici araçları", + "editor-devtools/@settings-name-enableCleanUpPlus": "\"Blokları temizle\"yi geliştir", + "editor-devtools/@settings-name-enablePasteBlocksAtMouse": "Blokları fare imlecinin bulunduğu konuma yapıştır", + "find-bar/@description": "Sesler sekmesinin yanına kodları, kostümleri ve sesleri bulmak ve onlara gitmek için bir arama çubuğu ekler. Arama çubuğunu kullandıktan sonra önceki veya sonraki ziyaret edilen konuma gitmek için kod alanında Ctrl+Sol ve Ctrl+Sağ tuşlarını kullanın.", + "find-bar/@info-developer-tools": "Bu eklenti öncesinde \"geliştirici araçları\" eklentisinin bir parçasıydı ancak artık buraya taşındı.", + "find-bar/@name": "Editörde arama çubuğu", + "middle-click-popup/@description": "Kod alanına farenizin orta tuşuyla tıklayın, bir bloğun adını (veya parçalarını) yazabileceğiniz ve bloğu kod alanına sürükleyebileceğiniz kayan bir giriş kutusu getirmek için Ctrl+Boşluk veya Shift+Tıkla tuşlarını kullanın. Aynı anda birden çok blok eklerken kutuyu kapatmamak için sürüklerken Shift tuşunu basılı tutun.", + "middle-click-popup/@info-developer-tools": "Bu eklenti daha önce \"geliştirici araçları\" eklentisinin bir parçasıydı ancak buraya taşındı.", + "middle-click-popup/@name": "İsmine göre blok ekleme", + "jump-to-def/@description": "Orta fare düğmesiyle veya bloğa Shift+Tıklayarak özel bir bloğun tanımına gitmenize izin verir.", + "jump-to-def/@info-developer-tools": "Bu eklenti öncesinde \"geliştirici araçları\" eklentisinin bir parçasıydı ancak artık buraya taşındı.", + "jump-to-def/@name": "Özel blok tanımına git", + "editor-searchable-dropdowns/@description": "Blok listelerini aramanıza olanak tanır.", + "editor-searchable-dropdowns/@name": "Arama yapılabilen açılır listeler", + "data-category-tweaks-v2/@description": "Verideki (\"Değişkenler\") blok kategorisi için ince ayarlar sağlar.", + "data-category-tweaks-v2/@name": "Veri kategorisi ince ayarları", + "data-category-tweaks-v2/@settings-name-moveReportersDown": "Veri bloklarını bölümünü değişkenler listesinin üstüne taşır", + "data-category-tweaks-v2/@settings-name-separateListCategory": "Ayrı Liste Kategorisi", + "data-category-tweaks-v2/@settings-name-separateLocalVariables": "Ayrı Yalnızca Kukla Değişkenleri", + "block-palette-icons/@description": "Blok kategorilerini açıklayan renkli dairelerin içine simgeler ekler.", + "block-palette-icons/@name": "Blok paleti kategori simgeleri", + "hide-flyout/@description": "İmleç üzerine getirilmezse blok paletini gizler. Geçici olarak gizlenmesini önlemek için kilit simgesine tıklayın. Alternatif olarak, \"kategori tıklaması\" modunu kullanın.", + "hide-flyout/@info-hoverExplanation": "\"Palet alanı üzerine gelin\" modu yalnızca görüntüleme alanını genişletir. Blokları çöpe atılmadan o alana sürükleyebilmek istiyorsanız, diğer modlardan birini kullanın.", + "hide-flyout/@name": "Otomatik gizlenen blok paleti", + "hide-flyout/@settings-name-speed": "Animasyon hızı", + "hide-flyout/@settings-name-toggle": "Açık...", + "hide-flyout/@settings-select-speed-default": "Varsayılan", + "hide-flyout/@settings-select-speed-long": "Yavaş", + "hide-flyout/@settings-select-speed-none": "Anında", + "hide-flyout/@settings-select-speed-short": "Hızlı", + "hide-flyout/@settings-select-toggle-category": "Kategori tıklaması", + "hide-flyout/@settings-select-toggle-cathover": "Kategori vurgusu", + "hide-flyout/@settings-select-toggle-hover": "Palet alanı kaydırıcısı", + "hide-flyout/@update": "Bu eklenti revize edildi ve birçok hatası düzeltildi.", + "mediarecorder/@description": "Editörün menü çubuğuna projenizin videosunu kaydetmenizi sağlayan bir \"kaydı başlat\" düğmesi ekler.", + "mediarecorder/@name": "Proje video kaydedicisi", + "drag-drop/@description": "Dosya yöneticinizden görselleri ve sesleri kukla bölmesine veya kostüm/ses listesine sürükleyebilmenizi sağlar. Ayrıca metin dosyalarını listelere veya \"sor ve bekle\" soru girişlerine sürükleyebilirsiniz.", + "drag-drop/@name": "Dosya sürükleme ve bırakma", + "drag-drop/@settings-name-use-hd-upload": "HD yüklemeleri kullan", + "debugger/@name": "Hata ayıklayıcısı", + "debugger/@settings-name-log_broadcasts": "Bir haber salındığında günlüğe kaydet", + "debugger/@settings-name-log_clear_greenflag": "Yeşil bayrağa tıklandığında günlükleri temizle", + "debugger/@settings-name-log_clone_create": "İkiz oluşturulduğunda günlüğe kaydet", + "debugger/@settings-name-log_failed_clone_creation": "Azami ikiz sayısı aşıldığında günlüğe kaydet", + "debugger/@settings-name-log_greenflag": "Yeşil bayrağa tıklandığında günlüğe kaydet", + "debugger/@update": "Hata ayıklayıcı penceresinde yeni “Blok Dizeleri\" ve \"Performans\" sekmeleri.", + "pause/@description": "Yeşil bayrağın yanına bir duraklat düğmesi ekler.", + "pause/@name": "Duraklat butonu", + "mute-project/@description": "Projeyi susturmak/susturmayı kaldırmak için yeşil bayrağa ctrl ile tıklayın.", + "mute-project/@info-macOS": "MacOS'ta Ctrl tuşu yerine Cmd tuşunu kullanın.", + "mute-project/@name": "Sessiz proje oynatma modu", + "vol-slider/@description": "Sesi ayarlamak için yeşil bayrağın yanına bir çubuk ekler.", + "vol-slider/@name": "Projelerde ses ayarı", + "vol-slider/@settings-name-defVol": "Varsayılan ses düzeyi", + "clones/@description": "Düzenleyicide sahnedeki toplam ikiz sayısını gösteren bir sayaç ekler.", + "clones/@name": "İkiz sayacı", + "clones/@settings-name-showicononly": "Sadece simgeyi göster", + "mouse-pos/@description": "Düzenleyicide farenizin x/y konumunu sahnenin üzerinde görüntüler.", + "mouse-pos/@name": "Fare konumu", + "color-picker/@description": "Renk seçicilere onaltılık kod girişleri ekler.", + "color-picker/@name": "Hex renk seçici", + "remove-sprite-confirm/@description": "Bir kuklayı silerken emin olup olmadığınızı sorar.", + "remove-sprite-confirm/@name": "Kukla silme onayı", + "block-count/@description": "Düzenleyicideki menü çubuğunda bir projedeki toplam blok sayısını gösterir. Daha önce “kukla ve kod sayısı\"nın bir parçasıydı.", + "block-count/@name": "Blok sayısı", + "onion-skinning/@description": "Bir kostümü düzenlerken önceki veya sonraki kostümlerin şeffaf hâllerini gösterir. Kostüm editöründeki yakınlaştırma düğmelerinin altındaki düğmelerle kontrol edilir.", + "onion-skinning/@name": "Önceki kostümün izi", + "onion-skinning/@settings-name-afterTint": "Sonraki kostüm tonu", + "onion-skinning/@settings-name-beforeTint": "Önceki kostüm tonu", + "onion-skinning/@settings-name-default": "Varsayılan olarak etkinleştir", + "onion-skinning/@settings-name-layering": "Varsayılan katmanlama", + "onion-skinning/@settings-name-mode": "Varsayılan mod", + "onion-skinning/@settings-name-next": "Varsayılan sonraki kostümler", + "onion-skinning/@settings-name-opacity": "Saydamlık (%)", + "onion-skinning/@settings-name-opacityStep": "Saydamlık derecesi (%)", + "onion-skinning/@settings-name-previous": "Varsayılan önceki kostümler", + "onion-skinning/@settings-select-layering-behind": "Arka", + "onion-skinning/@settings-select-layering-front": "Ön", + "onion-skinning/@settings-select-mode-merge": "Görüntüleri birleştir", + "onion-skinning/@settings-select-mode-tint": "Renk tonu", + "paint-snap/@description": "Kostüm düzenleyicideki nesneleri sınırlayıcı kutulara ve vektör düğümlerine tutturun.", + "paint-snap/@name": "Kostüm editöründe tutturma", + "paint-snap/@settings-name-boxCenter": "Seçim kutusunun merkezinden tuttur", + "paint-snap/@settings-name-boxCorners": "Seçim kutusunun köşelerinden tuttur", + "paint-snap/@settings-name-boxEdgeMids": "Seçim kutusunun kenar orta noktalarından tuttur", + "paint-snap/@settings-name-enable-default": "Varsayılan olarak etkinleştir", + "paint-snap/@settings-name-guide-color": "Kılavuz rengini tuttur", + "paint-snap/@settings-name-objectCenters": "Nesnelerin merkezlerine tuttur", + "paint-snap/@settings-name-objectCorners": "Nesnelerin köşelerine tuttur", + "paint-snap/@settings-name-objectEdges": "Nesnelerin kenarlarına tuttur", + "paint-snap/@settings-name-objectMidlines": "Nesnelerin orta hatlarına tuttur", + "paint-snap/@settings-name-pageAxes": "Sayfanın x ve y eksenlerine tuttur", + "paint-snap/@settings-name-pageCenter": "Sayfanın merkezine tuttur", + "paint-snap/@settings-name-pageCorners": "Sayfanın köşelerine tuttur", + "paint-snap/@settings-name-pageEdges": "Sayfanın kenarlarına tuttur", + "paint-snap/@settings-name-threshold": "Tutturma mesafesi", + "default-costume-editor-color/@description": "Kostüm düzenleyici tarafından kullanılan varsayılan renkleri ve kenarlık boyutunu değiştirir.", + "default-costume-editor-color/@name": "Özelleştirilebilir varsayılan kostüm düzenleyicisi renkleri", + "default-costume-editor-color/@settings-name-fill": "Varsayılan doldurma rengi", + "default-costume-editor-color/@settings-name-persistence": "Araçları değiştirdikten sonra sıfırlanma yerine önceki rengi kullan", + "default-costume-editor-color/@settings-name-stroke": "Varsayılan kenarlık rengi", + "default-costume-editor-color/@settings-name-strokeSize": "Varsayılan kenarlık boyutu", + "bitmap-copy/@description": "Kostüm düzenleyiciden bir bitmap görüntüsünü sistem panosuna kopyalamanıza izin verir. Böylece görselleri başka sitelerle veya yazılımlarla paylaşabilirsiniz.", + "bitmap-copy/@info-norightclick": "\"Sağ tıkla → kopyala\" desteklenmez. Bir bitmap görüntüsü seçiliyken Ctrl + C tuşlarına basmalısınız.", + "bitmap-copy/@name": "Bitmap resimleri kopyala", + "2d-color-picker/@description": "Kostüm düzenleyicideki doygunluk ve parlaklık kaydırıcılarını 2B renk seçiciyle değiştirir. Tek bir eksendeki değerleri değiştirmek için imleci sürüklerken Shift tuşunu basılı tutun.", + "2d-color-picker/@name": "2B renk seçici", + "better-img-uploads/@description": "Kalite kaybını önlemek için, yüklenen bitmap görüntüleri otomatik olarak SVG (vektörel) görüntülere dönüştüren \"kostüm yükle\" düğmesinin üzerine yeni bir düğme ekler.", + "better-img-uploads/@info-notSuitableEdit": "Resmi yükledikten sonra düzenlemeyi düşünüyorsanız, HD yükle düğmesini kullanmaktan kaçının.", + "better-img-uploads/@name": "HD görsel yüklemeleri", + "better-img-uploads/@settings-name-fitting": "Görüntü boyutlandırma", + "better-img-uploads/@settings-select-fitting-fill": "Sahneyi doldurmak için gerdir", + "better-img-uploads/@settings-select-fitting-fit": "Sahneye sığdırmak için küçült", + "better-img-uploads/@settings-select-fitting-full": "Orijinal boyut", + "pick-colors-from-stage/@description": "Kostüm editöründeki damla aracının renkleri sahneden de seçmesine izin verir.", + "pick-colors-from-stage/@name": "Kostüm düzenleyicide sahne renklerini seç", + "custom-block-shape/@description": "Blokların dolgusunu, köşe yarıçapını ve çentik yüksekliğini ayarlayın.", + "custom-block-shape/@info-paddingWarning": "Dolgu boyutunun küçültülmesi yalnızca sizin tarafınızdan görülebilir. Bu nedenle projeleriniz diğer kullanıcılar tarafından görüntülendiğinde komut dosyalarınız çakışabilir.", + "custom-block-shape/@name": "Özelleştirilebilir blok şekli", + "custom-block-shape/@preset-description-default2": "Scratch 2.0 bloklarına benzeyen bir görünüm", + "custom-block-shape/@preset-description-default3": "Scratch 3.0 bloklarının normal görünümü", + "custom-block-shape/@preset-description-flat2": "Çentikleri ve köşeleri kaldırılmış Scratch 2.0 blokları", + "custom-block-shape/@preset-description-flat3": "Çentikleri ve köşeleri kaldırılmış Scratch 3.0 blokları", + "custom-block-shape/@preset-name-default2": "2.0 Blokları", + "custom-block-shape/@preset-name-default3": "3.0 Bloklar", + "custom-block-shape/@preset-name-flat2": "2.0 Düz", + "custom-block-shape/@preset-name-flat3": "3.0 Düz", + "custom-block-shape/@settings-name-cornerSize": "Köşe boyutu (%0-300)", + "custom-block-shape/@settings-name-notchSize": "Çentik yüksekliği (%0-150)", + "custom-block-shape/@settings-name-paddingSize": "Dolgu boyutu (%50-200)", + "zebra-striping/@description": "Aynı tür blokların, birbiri içine yerleştirildiğinde açık ve koyu tonlar arasında geçiş yapmasını sağlar. Bu aynı zamanda zebra çizgileri olarak da bilinir.", + "zebra-striping/@name": "İç içe olan blok renklerini değiştir", + "zebra-striping/@settings-name-intensity": "Yoğunluk (%0-100)", + "zebra-striping/@settings-name-shade": "Ton", + "zebra-striping/@settings-select-shade-darker": "Daha koyu", + "zebra-striping/@settings-select-shade-lighter": "Daha açık", + "editor-theme3/@description": "Düzenleyicide her bir kategori için blok renklerini düzenleyin.", + "editor-theme3/@name": "Özelleştirilebilir blok renkleri", + "editor-theme3/@preset-description-black": "Blok arka planlarını siyah yapar", + "editor-theme3/@preset-description-dark": "Varsayılan renklerin koyu versiyonları", + "editor-theme3/@preset-description-original": "Scratch 2.0'dan orijinal blok renkleri", + "editor-theme3/@preset-description-tweaks": "2.0'dan ilham alan renklerle Olaylar, Kontrol ve Özel bloklar", + "editor-theme3/@preset-name-black": "Siyah", + "editor-theme3/@preset-name-dark": "Koyu", + "editor-theme3/@preset-name-original": "2.0 Renkleri", + "editor-theme3/@preset-name-tweaks": "3.0 İnce Ayarları", + "editor-theme3/@settings-name-Pen-color": "uzantılar", + "editor-theme3/@settings-name-comment-color": "Yorumlar", + "editor-theme3/@settings-name-control-color": "kontrol", + "editor-theme3/@settings-name-custom-color": "özel", + "editor-theme3/@settings-name-data-color": "değişkenler", + "editor-theme3/@settings-name-data-lists-color": "listeler", + "editor-theme3/@settings-name-events-color": "olaylar", + "editor-theme3/@settings-name-input-color": "Blok girişleri", + "editor-theme3/@settings-name-looks-color": "görünüm", + "editor-theme3/@settings-name-motion-color": "hareket", + "editor-theme3/@settings-name-operators-color": "operatörler", + "editor-theme3/@settings-name-sensing-color": "algılama", + "editor-theme3/@settings-name-sounds-color": "ses", + "editor-theme3/@settings-name-text": "Yazı rengi", + "editor-theme3/@settings-select-text-black": "Siyah", + "editor-theme3/@settings-select-text-colorOnBlack": "Siyah arka plan üzerine renkli", + "editor-theme3/@settings-select-text-colorOnWhite": "Beyaz arka plan üzerine renkli", + "editor-theme3/@settings-select-text-white": "Beyaz", + "editor-theme3/@update": "\"Düzenleyici koyu modu ve özelleştirilebilir renkler\"deki \"Koyu yorumlar\" ayarı buraya taşındı ve artık özelleştirilebilir.", + "custom-block-text/@description": "Bloklardaki metnin kalınlığını değiştirir ve isteğe bağlı olarak bir metin gölgesi ekler.", + "custom-block-text/@name": "Özelleştirilebilir blok metin stili", + "custom-block-text/@settings-name-bold": "Kalın metin", + "custom-block-text/@settings-name-shadow": "Metin altında gölge", + "editor-colored-context-menus/@description": "Blok sağ tıklandığında çıkan bağlam menülerini renkli hale getirir.", + "editor-colored-context-menus/@name": "Renkli bağlam menüleri", + "editor-stage-left/@description": "Sahneyi Scratch 2.0'daki gibi editörün sol tarafına taşır.", + "editor-stage-left/@info-reverseOrder": "Sahne üzerindeki düğmelerin konumunu değiştirmek için \"ters çevrilmiş proje kontrolleri\" eklentisini kullanın.", + "editor-stage-left/@name": "Sahneyi sol tarafta göster", + "editor-buttons-reverse-order/@description": "Scratch 2.0'daki gibi yeşil bayrak ve durdurma düğmelerini sağa, tam ekran düğmesini ise sola götürür.", + "editor-buttons-reverse-order/@name": "Ters çevrilmiş proje kontrolleri", + "variable-manager/@description": "Editörde \"sesler\" sekmesinin yanına değişken ve listelerinizi kolaylıkla yönetebileceğiniz bir sekme ekler.", + "variable-manager/@name": "Değişken yöneticisi", + "variable-manager/@update": "Liste ögeleri artık Shift tuşuna basılmadan eklenebilir.", + "search-sprites/@description": "Karakterleri ismine göre aramak için kukla bölmesine bir arama kutusu ekler.", + "search-sprites/@name": "İsmine göre kukla arama", + "sprite-properties/@description": "Varsayılan olarak - Scratch 2.0'daki gibi - kukla özellikleri panelini gizler. Özellikler panelini tekrar göstermek için seçili kuklanın üzerindeki bilgi düğmesine veya kuklaya çift tıklayın. Tekrar gizlemek için özellikler panelindeki daraltma düğmesine veya kuklaya çift tıklayın.", + "sprite-properties/@name": "Daraltılmış kukla özellikleri", + "sprite-properties/@settings-name-autoCollapse": "Fare kukla panelinden çıktığında otomatik olarak daralt", + "sprite-properties/@settings-name-hideByDefault": "Varsayılan olarak paneli daralt", + "sprite-properties/@settings-name-transitionDuration": "Animasyon hızı", + "sprite-properties/@settings-select-transitionDuration-default": "Varsayılan", + "sprite-properties/@settings-select-transitionDuration-long": "Yavaş", + "sprite-properties/@settings-select-transitionDuration-none": "Ani", + "sprite-properties/@settings-select-transitionDuration-short": "Hızlı", + "gamepad/@description": "Bir USB veya Bluetooth denetleyicisi/oyun kumandası kullanarak projelerle etkileşim kurun.", + "gamepad/@name": "Oyun kumandası desteği", + "gamepad/@settings-name-hide": "Hiçbir denetleyici algılanmadığında ayarlar düğmesini gizle", + "editor-sounds/@description": "Blokları bağladığınızda veya sildiğinizde ses efektleri çalar.", + "editor-sounds/@name": "Editör ses efektleri", + "folders/@description": "Kostüm, ses ve kukla bölmesine klasörler ekleme imkânı tanıt. Bir klasör oluşturmak için herhangi bir kuklaya sağ tıklayın ve \"klasör oluştur\" seçeneğine tıklayın. Klasörü açmak veya kapatmak için bir klasöre tıklayın. Bir kuklayı hangi klasörlere taşıyabileceğinizi görmek için sağ tıklayın veya alternatif olarak açık bir klasöre sürükleyip bırakın. Bu özellik, kuklalarınızın adlarının başına \"[klasörAdı]//\" ekleyerek çalışır.", + "folders/@info-notice-folders-are-public": "Sadece bu özelliği etkinleştiren kullanıcılar, projenizdeki klasörleri görebilir. Diğer herkes kuklaların listelerini normal olarak görecektir (klasör olmayacaktır).", + "folders/@name": "Kukla klasörleri", + "block-switching/@description": "İlgili bloğa geçmek için bloğa sağ tıklayın.", + "block-switching/@name": "Blok değiştirme", + "block-switching/@settings-name-control": "Kontrol blokları", + "block-switching/@settings-name-customargs": "Özel blok argümanları", + "block-switching/@settings-name-customargsmode": "Gösterilen özel blok argümanları seçenekleri", + "block-switching/@settings-name-data": "Veri blokları", + "block-switching/@settings-name-event": "Olay blokları", + "block-switching/@settings-name-extension": "Uzantı blokları", + "block-switching/@settings-name-looks": "Görünüm blokları", + "block-switching/@settings-name-motion": "Hareket blokları", + "block-switching/@settings-name-noop": "Kendine bloğu değiştirme seçeneğini göster", + "block-switching/@settings-name-operator": "Operatör blokları", + "block-switching/@settings-name-sensing": "Algılama blokları", + "block-switching/@settings-name-sound": "Ses blokları", + "block-switching/@settings-select-customargsmode-all": "Kukla'daki tüm özel bloklardaki argümanlar", + "block-switching/@settings-select-customargsmode-defOnly": "Kendi özel bloğundaki argümanlar", + "load-extensions/@description": "Düzenleyicideki blok kategorisi menüsünde müzik, kalem ve diğer uzantıları otomatik olarak gösterir.", + "load-extensions/@name": "Eklentileri otomatik olarak ekle", + "load-extensions/@settings-name-music": "Müzik", + "load-extensions/@settings-name-pen": "Kalem", + "load-extensions/@settings-name-text2speech": "Metinden Sese", + "load-extensions/@settings-name-translate": "Çeviri", + "custom-zoom/@description": "Kod alanındaki blokların yakınlaştırmasının minimum, maksimum, hız ve başlangıç boyutu için özel ayarları seçin ve kontrolleri otomatik olarak gizleyin.", + "custom-zoom/@name": "Özelleştirilebilir kod alanı büyütmesi", + "custom-zoom/@settings-name-autohide": "Büyütme Kontrollerini Otomatik Gizle", + "custom-zoom/@settings-name-maxZoom": "En Fazla Yakınlaştırma (%100-500)", + "custom-zoom/@settings-name-minZoom": "Minimum Yakınlaştırma (%1-100)", + "custom-zoom/@settings-name-speed": "Otomatik Gizleme Animasyon Hızı", + "custom-zoom/@settings-name-startZoom": "Başlangıç Büyüklüğü (%50-500)", + "custom-zoom/@settings-name-zoomSpeed": "Büyütme Hızı (%50-200)", + "custom-zoom/@settings-select-speed-default": "Varsayılan", + "custom-zoom/@settings-select-speed-long": "Yavaş", + "custom-zoom/@settings-select-speed-none": "Anında", + "custom-zoom/@settings-select-speed-short": "Hızlı", + "initialise-sprite-position/@description": "Yeni kuklanın varsayılan x/y konumunu değiştirin.", + "initialise-sprite-position/@name": "Özelleştirilebilir yeni eklenen kukla konumu", + "initialise-sprite-position/@settings-name-duplicate": "Kuklalar çoğaltıldığında gerçekleşecek davranış", + "initialise-sprite-position/@settings-name-library": "Kütüphaneden gelen kuklalarının yerlerini rastgele belirle", + "initialise-sprite-position/@settings-name-x": "X konumu", + "initialise-sprite-position/@settings-name-y": "Y konumu", + "initialise-sprite-position/@settings-select-duplicate-custom": "Belirtilen x/y değerlerine gönder", + "initialise-sprite-position/@settings-select-duplicate-keep": "Orijinal kuklayla aynı konumda tut", + "initialise-sprite-position/@settings-select-duplicate-randomize": "Rastgele bir konuma gönder", + "blocks2image/@description": "Blokları SVG/PNG olarak dışa aktarmak için kod alanına sağ tıklayın.", + "blocks2image/@name": "Blokları resim olarak kaydedin", + "remove-curved-stage-border/@description": "Sahnenin etrafındaki kavisli çerçeveyi kaldırır. Bu sayede sahnenin köşelerinin görünmesine izin verir.", + "remove-curved-stage-border/@name": "Kavisli sahne kenarlığını kaldır", + "transparent-orphans/@description": "Artık bloklar (üstte şapka bloğu olanlar dışında) ve sürüklenen bloklar için ayrı seçeneklerle düzenleyicide blokların şeffaflığını ayarlayın.", + "transparent-orphans/@name": "Blok saydamlığı", + "transparent-orphans/@settings-name-block": "Blok saydamlığı (%)", + "transparent-orphans/@settings-name-dragged": "Sürüklenirkenki saydamlık (%)", + "transparent-orphans/@settings-name-orphan": "Fazlalıkkenki saydamlık (%)", + "paint-by-default/@description": "Kitaplığı varsayılan olarak açan \"Bir Kukla/Kostüm/Arka Plan/Ses Seç\" düğmelerinin varsayılan eylemini değiştirir.", + "paint-by-default/@name": "Varsayılan olarak kostümü boya", + "paint-by-default/@settings-name-backdrop": "Dekor ekle", + "paint-by-default/@settings-name-costume": "Kostüm ekle", + "paint-by-default/@settings-name-sound": "Ses ekle", + "paint-by-default/@settings-name-sprite": "Kukla ekle", + "paint-by-default/@settings-select-backdrop-library": "Kütüphane", + "paint-by-default/@settings-select-backdrop-paint": "Boya", + "paint-by-default/@settings-select-backdrop-surprise": "Sürpriz", + "paint-by-default/@settings-select-backdrop-upload": "Yükle", + "paint-by-default/@settings-select-costume-library": "Kütüphane", + "paint-by-default/@settings-select-costume-paint": "Boya", + "paint-by-default/@settings-select-costume-surprise": "Sürpriz", + "paint-by-default/@settings-select-costume-upload": "Yükle", + "paint-by-default/@settings-select-sound-library": "Kütüphane", + "paint-by-default/@settings-select-sound-record": "Kayıt", + "paint-by-default/@settings-select-sound-surprise": "Sürpriz", + "paint-by-default/@settings-select-sound-upload": "Yükle", + "paint-by-default/@settings-select-sprite-library": "Kütüphane", + "paint-by-default/@settings-select-sprite-paint": "Boya", + "paint-by-default/@settings-select-sprite-surprise": "Sürpriz", + "paint-by-default/@settings-select-sprite-upload": "Yükle", + "block-cherry-picking/@description": "Ctrl tuşuna basılı tutarken tek bir bloğu (aşağısına eklenen tüm yığınla birlikte almak yerine) kodun aralarından alabilme yeteneği ekler.", + "block-cherry-picking/@info-flipControls": "\"Kontrolleri çevir\" etkinleştirilmişse, blokları tek tek almak varsayılan davranış olacaktır. Yığının tamamını almak için Ctrl tuşuna basılı tutun.", + "block-cherry-picking/@info-macContextDisabled": "macOS'ta Ctrl tuşu yerine Cmd tuşunu kullanın.", + "block-cherry-picking/@name": "Ctrl tuşu ile tek bir blok alın", + "block-cherry-picking/@settings-name-invertDrag": "Kontrolleri çevir", + "hide-new-variables/@description": "Yeni oluşturulan değişkenler veya listeler için otomatik olarak görüntüler oluşturmayın.", + "hide-new-variables/@name": "Yeni eklenen değişkenleri gizle", + "editor-extra-keys/@description": "\"() tuşuna basılı mı?\" ve \"() tuşuna basıldığında\" bloklarının açılır menülerine enter, nokta ve virgül gibi fazladan tuşlar tuşlar ekler. Bu anahtarlar, bu eklentiye sahip olmayan kullanıcılarda bile çalışacaktır.", + "editor-extra-keys/@info-experimentalKeysWarn": "\"Deneysel tuşlar\" eşittir, eğik çizgi, noktalı virgül ve daha fazlasını içerir. Tüm işletim sistemlerinde veya klavye düzenlerinde çalışmayabilirler.", + "editor-extra-keys/@info-shiftKeysWarn": "\"Shift tuşları\", çoğunlukla Shift tuşunu ve bir sayı tuşunu gerektiren tuşları içerir, heştek, ünlem işareti ve daha fazlası gibi. Bu tuşlar yalnızca \"() tuşuna basıldığında\" bloğu ile çalışır ve tüm işletim sistemlerinde veya klavye düzenlerinde çalışmaz.", + "editor-extra-keys/@name": "Fazladan tuş seçenekleri", + "editor-extra-keys/@settings-name-experimentalKeys": "Deneysel tuşları göster", + "editor-extra-keys/@settings-name-shiftKeys": "Shift tuşlarını göster", + "hide-delete-button/@description": "Kuklalarda, kostümlerde ve seslerde silme düğmesini (çöp kutusu simgesini) gizler. Sağ tıklama bağlam menüsü kullanılarak yine de silinebilirler.", + "hide-delete-button/@name": "Sil düğmesini gizle", + "hide-delete-button/@settings-name-costumes": "Kostümler ve dekorlar", + "hide-delete-button/@settings-name-sounds": "Sesler", + "hide-delete-button/@settings-name-sprites": "Kuklalar", + "no-script-bumping/@description": "Üst üste binen kodların hareket etmesine neden olmadan kodların taşınmasına ve değiştirilmesine izin verir.", + "no-script-bumping/@name": "Üst üste binen kodları otomatik olarak yana kaydırmama", + "disable-stage-drag-select/@description": "Özellikle sürüklenebilir olarak ayarlanmış olanlar dışında, düzenleyicideyken sahnedeki kuklaları sürükleme özelliğini kaldırır. Bir kuklayı normal şekilde taşımak için sürüklerken Shift tuşuna basılı tutun.", + "disable-stage-drag-select/@name": "Düzenleyicide sürüklenemeyen kuklalar", + "move-to-top-bottom/@description": "Kostümleri ve sesleri, listenin en üstüne ya da en altına taşımak için sağ tıklama bağlam menüsüne seçenekler ekler.", + "move-to-top-bottom/@info-developer-tools": "Bu eklenti öncesinde \"geliştirici araçları\" eklentisinin bir parçasıydı ancak artık buraya taşındı.", + "move-to-top-bottom/@name": "Kostümü yukarı veya aşağı taşı", + "disable-paste-offset/@description": "Çoğaltılan ögeleri kostüm düzenleyicide hafifçe kaydırmak yerine orijinal konumlarına yapıştırın.", + "disable-paste-offset/@info-vanilla": "Bu davranış bu eklenti olmadan da ögeye Alt+Tıklamayla gerçekleştirilebilir.", + "disable-paste-offset/@name": "Yapıştırılan öğeleri kenara kaydırmama", + "block-duplicate/@description": "Alt tuşunu basılı tutarken bir kodu sürükleyerek onu hızlıca çoğaltın. Altına eklenen yığının tamamı yerine yalnızca tek bir bloğu çoğaltmak için Ctrl tuşuna da basılı tutun.", + "block-duplicate/@info-mac": "macOS’ta Alt tuşu yerine Option tuşunu ve Kontrol tuşu yerine Komut tuşunu kullanın.", + "block-duplicate/@name": "Alt tuşuyla kodu çoğalt", + "swap-local-global/@description": "Mevcut bir değişkeni veya listeyi yeniden adlandırırken daha fazla seçenek ekler: \"Tüm kuklalar için\" ve \"Yalnızca bu kukla için\" arasında değişiklik yapılmasına ve değişkenlerin bulutta depolanıp depolanmayacağına izin verir. Ayrıca durumunu hızlı bir şekilde değiştirmek için değişkene/listeye sağ tıklandığında yeni bir seçenek ekler.", + "swap-local-global/@name": "\"Tüm kuklalar için\" ve \"Yalnızca bu kukla için\" arasında geçiş yapma", + "editor-comment-previews/@description": "Fareyle daraltılmış yorumların ve blokların üzerine gelerek yorumların içeriğinin ön izlemesini görmeye olanak tanır. Bunu ekran dışındaki yorumları görüntülemek için, ön izlemesiyle alttan bir döngü bloğu belirlemek için, birçok uzun yorumu küçük bir alana sığdırmak için ve çok daha fazlası için kullanabilirsiniz.", + "editor-comment-previews/@name": "Düzenleyici yorumları ön izlemeleri", + "editor-comment-previews/@settings-name-delay": "Gecikme süresi", + "editor-comment-previews/@settings-name-follow-mouse": "Fareyi takip et", + "editor-comment-previews/@settings-name-hover-view": "Daraltılmış yorumları ön izlemek için gezdirin", + "editor-comment-previews/@settings-name-hover-view-block": "Ekli yorumları ön izlemek için blokların üzerine gelin", + "editor-comment-previews/@settings-name-hover-view-procedure": "Tanım yorumlarını ön izlemek için özel blokların üzerine gelin", + "editor-comment-previews/@settings-name-reduce-animation": "Animasyonu azalt", + "editor-comment-previews/@settings-name-reduce-transparency": "Saydamlığı azalt", + "editor-comment-previews/@settings-select-delay-long": "Uzun", + "editor-comment-previews/@settings-select-delay-none": "Yok", + "editor-comment-previews/@settings-select-delay-short": "Kısa", + "columns/@description": "Blok kategorisi menüsünü iki sütuna böler ve Scratch 2.0'daki gibi blok paletini en üstüne taşır.", + "columns/@name": "İki sütunlu kategori menüsü", + "number-pad/@description": "Yalnızca dokunmatik ekranlı cihazlar yerine tüm cihazlarda sayı alanlarını düzenlerken Scratch'in sayısal tuş takımı girişini görebilmenizi sağlar.", + "number-pad/@info-explanation": "\"x'i ... yap\" gibi belirli bloklardan gelen sayı girişlerini düzenlerken bir sayısal tuş takımı gösterilir.", + "number-pad/@name": "Sayısal tuş takımını her zaman göster", + "script-snap/@description": "Bloğu otomatik olarak kod alanı noktalarına hizalamak için bir kodu hareket ettirin.", + "script-snap/@name": "Kodları ızgaraya hizala", + "script-snap/@preset-name-default": "Varsayılan", + "script-snap/@preset-name-half-block": "Yarım blok", + "script-snap/@preset-name-whole-block": "Tam blok", + "script-snap/@settings-name-grid": "Izgara boyutu (piksel)", + "fullscreen/@description": "Proje oynatıcısının tam ekran modundaki bazı istenmeyen efektlerini düzeltir, tarayıcınızın tam ekran modunda açar ve yeşil bayrak araç çubuğunu gizler.", + "fullscreen/@info-hideToolbarNotice": "Araç çubuğunu gizlemeyi seçerseniz, proje oynatıcısının tam ekran modundan çıkmak için Esc tuşunu kullanabileceğinizi unutmayın.", + "fullscreen/@name": "Geliştirilmiş tam ekran", + "fullscreen/@settings-name-browserFullscreen": "Tam ekran proje oynatıcısını, tam ekran tarayıcı modunda aç", + "fullscreen/@settings-name-hideToolbar": "Tam ekrandayken araç çubuğunu gizle", + "hide-stage/@description": "Sahne alanını ve kukla bölmesini gizleyen \"küçük sahne\" ve \"büyük sahne\" düğmelerinin yanına bir düğme daha ekleyerek kod alanını çok daha büyük hâle getirir.", + "hide-stage/@name": "Sahneyi ve kukla bölmesini gizle", + "editor-stepping/@description": "Projede çalışmakta olan bloklara renkli bir vurgu ekler.", + "editor-stepping/@name": "Çalışan blok kenarlığı", + "editor-stepping/@settings-name-highlight-color": "Vurgu rengi" +} \ No newline at end of file diff --git a/src/addons/addons-l10n-settings/zh-tw.json b/src/addons/addons-l10n-settings/zh-tw.json new file mode 100644 index 0000000000000000000000000000000000000000..b5486f4d5820e252178562bbd5aac0dcff1555d8 --- /dev/null +++ b/src/addons/addons-l10n-settings/zh-tw.json @@ -0,0 +1,326 @@ +{ + "cat-blocks/@description": "顯示來自 2020 愚人節的貓貓積木。", + "cat-blocks/@info-watch": "“觀察鼠標光標”設置可能會影響編輯器打開時的性能。", + "cat-blocks/@name": "貓積木", + "cat-blocks/@settings-name-watch": "注視游標", + "editor-devtools/@description": "向編輯器添加新的列表選項:複製 / 貼上、更好地清理等!", + "editor-devtools/@name": "開發者工具", + "editor-devtools/@settings-name-enableCleanUpPlus": "增強的「整理積木」功能", + "editor-devtools/@settings-name-enablePasteBlocksAtMouse": "在游標停駐處貼上積木", + "find-bar/@description": "讓你快速找到程式、造型、音效的查找工具。在你開始查找後,你還可以在程式編輯區裡用 Ctrl+向左鍵、Ctrl+向右鍵來找到上一個、下一個所要查找的內容。", + "find-bar/@info-developer-tools": "這個擴充功能之前是在「開發工具」裡,現在移至這兒了!", + "find-bar/@name": "查找程式功能", + "middle-click-popup/@info-developer-tools": "此插件以前是“開發人員工具”插件的一部分,但已移至此處。", + "middle-click-popup/@name": "編輯積木的名字", + "jump-to-def/@description": "讓你能用滑鼠中鍵或是 Shift+左鍵來快速找到函式的定義。", + "jump-to-def/@info-developer-tools": "這個擴充功能之前是在「開發工具」裡,現在移至這兒了!", + "jump-to-def/@name": "移至函式定義積木", + "editor-searchable-dropdowns/@description": "在積木下拉清單多了一個可搜尋的欄位。", + "editor-searchable-dropdowns/@name": "可搜尋的下拉清單", + "data-category-tweaks-v2/@description": "讓積木類別中的資料(變量、清單)有更好的分類。", + "data-category-tweaks-v2/@name": "更好的資料分類", + "data-category-tweaks-v2/@settings-name-moveReportersDown": "將積木移動到創建資料的上方", + "data-category-tweaks-v2/@settings-name-separateListCategory": "單獨將清單分類", + "data-category-tweaks-v2/@settings-name-separateLocalVariables": "把適用於當前角色的資料分類", + "block-palette-icons/@description": "除了以顏色分類積木,在裡面加上類別圖示。", + "block-palette-icons/@name": "積木分類圖示", + "hide-flyout/@description": "隱藏工具箱,在某些條件下才顯示。顯示的工具箱還可以用圖釘按鈕暫時固定它!", + "hide-flyout/@info-hoverExplanation": "「懸停在工具箱上」模式可能會在你拖曳編輯區上的積木時不小心移除,如果你怕出事,可以先試試其它模式。", + "hide-flyout/@name": "自動隱藏程式工具箱", + "hide-flyout/@settings-name-speed": "動畫速度", + "hide-flyout/@settings-name-toggle": "觸發條件", + "hide-flyout/@settings-select-speed-default": "預設", + "hide-flyout/@settings-select-speed-long": "慢", + "hide-flyout/@settings-select-speed-none": "立即", + "hide-flyout/@settings-select-speed-short": "快速", + "hide-flyout/@settings-select-toggle-category": "點擊類別時", + "hide-flyout/@settings-select-toggle-cathover": "懸停在類別上", + "hide-flyout/@settings-select-toggle-hover": "懸停在工具箱上", + "hide-flyout/@update": "這個擴充功能修正過了,很多已知問題已經修復。", + "mediarecorder/@description": "在程式編輯頁上的工具列添加一個「開始錄影」的功能,讓你可以將專案運行的過程錄製下來。", + "mediarecorder/@name": "專案視頻錄製", + "drag-drop/@description": "讓你可以把檔案直接拖入角色面板區然後直接上傳,當然,你還能將文字文件拖曳到文字輸入框裡。", + "drag-drop/@name": "拖曳檔案上傳", + "drag-drop/@settings-name-use-hd-upload": "使用高清圖片上傳", + "debugger/@name": "偵錯器", + "debugger/@settings-name-log_broadcasts": "記錄廣播訊息", + "debugger/@settings-name-log_clear_greenflag": "當綠旗被點擊後清除紀錄", + "debugger/@settings-name-log_clone_create": "記錄分身創建", + "debugger/@settings-name-log_failed_clone_creation": "當分身的創建超過時記錄", + "debugger/@settings-name-log_greenflag": "記錄綠旗點擊", + "debugger/@update": "偵錯器面板裡的新的「執行緒」與「效能」頁籤。", + "pause/@description": "在點擊綠旗按鈕旁添加一個暫停的按鈕。", + "pause/@name": "編譯器暫停按鈕", + "mute-project/@description": "在你點擊綠旗時同時按住 Ctrl 鍵可以切換靜音模式。", + "mute-project/@info-macOS": "在 macOS 上,用 Cmd 鍵代替 Ctrl 鍵。", + "mute-project/@name": "專案播放時靜音", + "vol-slider/@description": "在綠旗控制項旁添加一個可以調整音量的控制桿。", + "vol-slider/@name": "專案音量控制桿", + "vol-slider/@settings-name-defVol": "預設音量", + "clones/@description": "在舞台上方添加一個計數器,顯示當前建立的分身數量。", + "clones/@name": "分身計數器", + "clones/@settings-name-showicononly": "只顯示圖標", + "mouse-pos/@description": "當鼠標在舞台上移動時,顯示所停駐的座標位置。", + "mouse-pos/@name": "鼠標的座標", + "color-picker/@description": "在選色器裡添加一個可以直接輸入十六進制色碼的欄位。", + "color-picker/@name": "代碼選色器", + "remove-sprite-confirm/@description": "當你刪除專案的某個角色前,顯示一個確認的詢問視窗。", + "remove-sprite-confirm/@name": "角色刪除確認", + "block-count/@description": "在編輯器的工具列上顯示目前專案已使用的程式積木數量。這個擴充功能是之前「角色與程式計數」的一部分。", + "block-count/@name": "程式積木計數", + "onion-skinning/@description": "當編輯造型時,以半透明的方式顯示上一個或下一個造型,有助於製作動畫。在編輯器下方縮放控制旁有額外的控制按鈕。", + "onion-skinning/@name": "動畫描圖紙", + "onion-skinning/@settings-name-afterTint": "下個造型要染的顏色", + "onion-skinning/@settings-name-beforeTint": "上個造型要染的顏色", + "onion-skinning/@settings-name-default": "預設啟用", + "onion-skinning/@settings-name-layering": "預設圖層排列", + "onion-skinning/@settings-name-mode": "預設顯示模式", + "onion-skinning/@settings-name-next": "預設顯示下個造型", + "onion-skinning/@settings-name-opacity": "透明度(%)", + "onion-skinning/@settings-name-opacityStep": "透明漸進(%)", + "onion-skinning/@settings-name-previous": "預設顯示上個造型", + "onion-skinning/@settings-select-layering-behind": "在後面", + "onion-skinning/@settings-select-layering-front": "在前面", + "onion-skinning/@settings-select-mode-merge": "合併", + "onion-skinning/@settings-select-mode-tint": "染色", + "paint-snap/@settings-name-pageAxes": "對齊頁面 x 位置和 y 位置軸", + "paint-snap/@settings-name-pageCenter": "去中心", + "paint-snap/@settings-name-pageCorners": "轉到屏幕角落", + "paint-snap/@settings-name-threshold": "改變的距離", + "default-costume-editor-color/@description": "變更在造型編輯器上填滿與外框的預選色彩,以及線條的預設寬度。", + "default-costume-editor-color/@name": "自訂造型編輯器上工具預設值", + "default-costume-editor-color/@settings-name-fill": "填滿的預設色彩", + "default-costume-editor-color/@settings-name-persistence": "切換工具後使用上一個顏色而非預設顏色", + "default-costume-editor-color/@settings-name-stroke": "外框的預設色彩", + "default-costume-editor-color/@settings-name-strokeSize": "外框的預設寬度", + "bitmap-copy/@description": "允許你直接複製繪圖編輯器上的點陣圖,然後貼到其它的網站或是軟體上。", + "bitmap-copy/@info-norightclick": "不支援「滑鼠右鍵 → 複製」的方式,請使用 Ctrl + C 的快速鍵。", + "bitmap-copy/@name": "點陣圖像複製功能", + "2d-color-picker/@description": "用二維選色器取代編輯器中的彩度與亮度控制桿。在拖曳游標的同時按住 Shift 鍵可以只調整直向或橫向的值。", + "2d-color-picker/@name": "二維選色器", + "better-img-uploads/@description": "在「上傳造型」按鈕的上方添加一個按鈕,可以將上傳的點陣圖自動轉換成向量圖(SVG),以避免丟失質量。", + "better-img-uploads/@info-notSuitableEdit": "如果你在上傳圖片還需要編輯,請不要使用高清圖片上傳功能。", + "better-img-uploads/@name": "高清圖片上傳", + "better-img-uploads/@settings-name-fitting": "圖像尺寸", + "better-img-uploads/@settings-select-fitting-fill": "放大以填滿舞台", + "better-img-uploads/@settings-select-fitting-fit": "縮小以適應舞台", + "better-img-uploads/@settings-select-fitting-full": "原始尺寸", + "pick-colors-from-stage/@description": "允許造型或背景編輯器上的揀色工具能夠挑選舞台視窗裡的顏色。", + "pick-colors-from-stage/@name": "揀色工具能選到舞台裡的色彩", + "custom-block-shape/@description": "調整積木內邊距、圓角、缺口高度。", + "custom-block-shape/@info-paddingWarning": "這些設置的效果只有你才看得到,如果是其它使用者觀看你的程式時,可能會有程式重疊的問題。", + "custom-block-shape/@name": "自訂程式積木外形", + "custom-block-shape/@preset-description-default2": "與 Scratch 2.0 相似的積木外觀", + "custom-block-shape/@preset-description-default3": "Scratch 3.0 版所顯示的積木形狀", + "custom-block-shape/@preset-description-flat2": "把 Scratch 2.0 的積木去除圓角與缺口", + "custom-block-shape/@preset-description-flat3": "把 Scratch 3.0 的積木去除圓角與缺口", + "custom-block-shape/@preset-name-default2": "2.0 積木外形", + "custom-block-shape/@preset-name-default3": "3.0 積木外形", + "custom-block-shape/@preset-name-flat2": "2.0 積木扁平化", + "custom-block-shape/@preset-name-flat3": "3.0 積木扁平化", + "custom-block-shape/@settings-name-cornerSize": "圓角率(0-300%)", + "custom-block-shape/@settings-name-notchSize": "缺口高度(0-150%)", + "custom-block-shape/@settings-name-paddingSize": "內邊距(50-200%)", + "zebra-striping/@description": "讓控制類程式在巢狀化的時候,能夠替換裡面程式的積木顏色,這樣會比較好辨識(這種高亮語法的方式叫 zebra striping)。", + "zebra-striping/@name": "替換巢狀程式顏色", + "zebra-striping/@settings-name-intensity": "程式(0-100%)", + "zebra-striping/@settings-name-shade": "陰影", + "zebra-striping/@settings-select-shade-darker": "變暗", + "zebra-striping/@settings-select-shade-lighter": "變亮", + "editor-theme3/@description": "修改編輯器上每種積木的色彩。", + "editor-theme3/@name": "自訂積木色彩", + "editor-theme3/@preset-description-black": "把所有的積木變黑", + "editor-theme3/@preset-description-dark": "把原來的積木色彩變暗", + "editor-theme3/@preset-description-original": "修改成與 Scratch 2.0 版一樣的積木顔色", + "editor-theme3/@preset-description-tweaks": "將事件、控制和函式積木調整成類似 2.0 版的顏色", + "editor-theme3/@preset-name-black": "黑色", + "editor-theme3/@preset-name-dark": "暗色調", + "editor-theme3/@preset-name-original": "2.0 色調", + "editor-theme3/@preset-name-tweaks": "3.0 調整版", + "editor-theme3/@settings-name-Pen-color": "擴充功能", + "editor-theme3/@settings-name-comment-color": "註解", + "editor-theme3/@settings-name-control-color": "控制", + "editor-theme3/@settings-name-custom-color": "函式積木", + "editor-theme3/@settings-name-data-color": "變數", + "editor-theme3/@settings-name-data-lists-color": "清單", + "editor-theme3/@settings-name-events-color": "事件", + "editor-theme3/@settings-name-input-color": "函式積木輸入欄位", + "editor-theme3/@settings-name-looks-color": "外觀", + "editor-theme3/@settings-name-motion-color": "動作", + "editor-theme3/@settings-name-operators-color": "運算", + "editor-theme3/@settings-name-sensing-color": "偵測", + "editor-theme3/@settings-name-sounds-color": "音效", + "editor-theme3/@settings-name-text": "文字顔色", + "editor-theme3/@settings-select-text-black": "黑色", + "editor-theme3/@settings-select-text-colorOnBlack": "為文字著色,背景改成黑色", + "editor-theme3/@settings-select-text-colorOnWhite": "為文字著色,背景改成白色", + "editor-theme3/@settings-select-text-white": "白色", + "editor-theme3/@update": "在「編輯器深色模式與自訂色彩」中關於「深色調註解」的設置已移至此處並且可以進一步自訂。", + "custom-block-text/@description": "變更文字的粗細度,並可選擇增加陰影效果。", + "custom-block-text/@name": "自訂積木文字樣式", + "custom-block-text/@settings-name-bold": "粗體字", + "custom-block-text/@settings-name-shadow": "文字加陰影", + "editor-colored-context-menus/@description": "在程式積木上點擊右鍵會開啟選單,讓開啟的選單有和積木相同的背景顏色。", + "editor-colored-context-menus/@name": "讓右鍵選單有顏色", + "editor-stage-left/@description": "將舞台區移動到編輯器畫面的左側,就像 Scratch 2.0 那樣。", + "editor-stage-left/@info-reverseOrder": "如果要修改專案預覽視窗上的按鈕位置,可以使用另一個擴充功能 - 「對調專案控制項工具的順序」。", + "editor-stage-left/@name": "將舞台顯示在編輯器左側", + "editor-buttons-reverse-order/@description": "在專案預覽視窗的上方有些按鈕,把右邊的綠旗與停止按鈕,與左邊的顯示模式按鈕對調顯示順序,就像 Scratch 2.0 那樣。", + "editor-buttons-reverse-order/@name": "對調專案控制項工具的順序", + "variable-manager/@description": "在編輯器的音效頁籤右側添加一個變量與清單的頁籤,讓你更方便的管理它們。", + "variable-manager/@name": "變數管理器", + "variable-manager/@update": "清單現在不需按住 Shift 鍵就可以插入項目。", + "search-sprites/@description": "在角色面板添加一個搜尋欄位,用來查找以名稱查找角色。", + "search-sprites/@name": "依名稱搜尋角色", + "sprite-properties/@settings-name-transitionDuration": "動畫速度", + "sprite-properties/@settings-select-transitionDuration-long": "顯示", + "sprite-properties/@settings-select-transitionDuration-short": "快", + "gamepad/@description": "用 USB 或藍芽控制器(遊戲手柄)與專案互動。", + "gamepad/@name": "遊戲手柄支持", + "gamepad/@settings-name-hide": "當未偵測到遊戲手柄時隱藏設置按鈕。", + "editor-sounds/@description": "在你貼合或刪除積木的時候發出音效。", + "editor-sounds/@name": "編輯器音效", + "folders/@description": "將文件夾添加到角色面板,造型和音效清單上也可以。要創建資料夾,請在任何物件上點擊右鍵,使用選單中「創建資料夾」功能。建立後,點擊資料夾可以開啟或是關閉它。在其它物件上點右鍵可以指定放進哪個資料夾,也可以用拖曳的方式。", + "folders/@info-notice-folders-are-public": "啟用這個功能後,只有你自己看得到資料夾,其他用戶是看不到的。", + "folders/@name": "角色資料夾", + "block-switching/@description": "在編輯區上用滑鼠右鍵點擊積木,就能選擇相關的積木進行切換。", + "block-switching/@name": "程式積木切換", + "block-switching/@settings-name-control": "控制類積木", + "block-switching/@settings-name-customargs": "函式積木參數", + "block-switching/@settings-name-customargsmode": "要顯示的函式參數", + "block-switching/@settings-name-data": "資料類積木", + "block-switching/@settings-name-event": "事件類積木", + "block-switching/@settings-name-extension": "擴展類積木", + "block-switching/@settings-name-looks": "外觀類積木", + "block-switching/@settings-name-motion": "動作類積木", + "block-switching/@settings-name-noop": "能切換的積木中包含自己", + "block-switching/@settings-name-operator": "運算類積木", + "block-switching/@settings-name-sensing": "偵測類積木", + "block-switching/@settings-name-sound": "音效類積木", + "block-switching/@settings-select-customargsmode-all": "全部函式用到的參數", + "block-switching/@settings-select-customargsmode-defOnly": "函式本身的參數", + "load-extensions/@description": "在新建專案時自動添加音樂、畫筆或其它的擴展到編輯器上。", + "load-extensions/@name": "自動添加擴展應用", + "load-extensions/@settings-name-music": "音樂", + "load-extensions/@settings-name-pen": "畫筆", + "load-extensions/@settings-name-text2speech": "文字轉語音", + "load-extensions/@settings-name-translate": "翻譯", + "custom-zoom/@description": "自訂縮小、放大的閾值、速度還有初始的縮放率,還可以設定是否顯示縮放控制項。", + "custom-zoom/@name": "自訂程式編輯區的縮放率", + "custom-zoom/@settings-name-autohide": "自動隱藏縮放控制項", + "custom-zoom/@settings-name-maxZoom": "最大可放大到(100-500%)", + "custom-zoom/@settings-name-minZoom": "最小可縮小到(1-100%)", + "custom-zoom/@settings-name-speed": "自動隱藏動畫速度", + "custom-zoom/@settings-name-startZoom": "初始的縮放率(50-500%)", + "custom-zoom/@settings-name-zoomSpeed": "縮放速度(50-200%)", + "custom-zoom/@settings-select-speed-default": "預設", + "custom-zoom/@settings-select-speed-long": "慢", + "custom-zoom/@settings-select-speed-none": "立即", + "custom-zoom/@settings-select-speed-short": "快速", + "initialise-sprite-position/@description": "更改新的角色的初始 x/y 座標。", + "initialise-sprite-position/@name": "自訂新建角色位置", + "initialise-sprite-position/@settings-name-duplicate": "複製角色時的行為", + "initialise-sprite-position/@settings-name-library": "角色庫的角色位置隨機", + "initialise-sprite-position/@settings-name-x": "X 座標", + "initialise-sprite-position/@settings-name-y": "Y 座標", + "initialise-sprite-position/@settings-select-duplicate-custom": "移至指定的座標位置", + "initialise-sprite-position/@settings-select-duplicate-keep": "與原來的角色位置一致", + "initialise-sprite-position/@settings-select-duplicate-randomize": "隨機位置", + "blocks2image/@description": "在程式編輯區上點擊滑鼠右鍵,可以把指定的積木匯出成 SVG/PNG 圖像。", + "blocks2image/@name": "保存積木為圖像", + "remove-curved-stage-border/@description": "拿掉舞台四周的圓角修飾,讓你能看見舞台的四個角。", + "remove-curved-stage-border/@name": "移除舞台邊緣圓角", + "transparent-orphans/@description": "調整編輯器中積木的透明度,可以為單一塊積木或是正在拖曳的積木個別設定透明值。", + "transparent-orphans/@name": "積木透明度", + "transparent-orphans/@settings-name-block": "程式區塊透明度(%)", + "transparent-orphans/@settings-name-dragged": "正在拖曳的積木透明度(%)", + "transparent-orphans/@settings-name-orphan": "單一積木透明度(%)", + "paint-by-default/@description": "選個角色/選個造型/選個背景/選個音效這些大按鈕預設都是從範例庫中選擇,改成其他操作,像是畫個造型、畫個背景…", + "paint-by-default/@name": "更改「選個xx」按鈕的預設操作", + "paint-by-default/@settings-name-backdrop": "添加背景", + "paint-by-default/@settings-name-costume": "添加造型", + "paint-by-default/@settings-name-sound": "添加音效", + "paint-by-default/@settings-name-sprite": "添加角色", + "paint-by-default/@settings-select-backdrop-library": "範例庫", + "paint-by-default/@settings-select-backdrop-paint": "繪畫", + "paint-by-default/@settings-select-backdrop-surprise": "驚喜", + "paint-by-default/@settings-select-backdrop-upload": "上傳", + "paint-by-default/@settings-select-costume-library": "範例庫", + "paint-by-default/@settings-select-costume-paint": "繪畫", + "paint-by-default/@settings-select-costume-surprise": "驚喜", + "paint-by-default/@settings-select-costume-upload": "上傳", + "paint-by-default/@settings-select-sound-library": "範例庫", + "paint-by-default/@settings-select-sound-record": "錄製", + "paint-by-default/@settings-select-sound-surprise": "驚喜", + "paint-by-default/@settings-select-sound-upload": "上傳", + "paint-by-default/@settings-select-sprite-library": "範例庫", + "paint-by-default/@settings-select-sprite-paint": "繪畫", + "paint-by-default/@settings-select-sprite-surprise": "驚喜", + "paint-by-default/@settings-select-sprite-upload": "上傳", + "block-cherry-picking/@description": "讓你可以按住 Ctrl 鍵把單個積木從程式區塊裡拖曳出來(原來會拖曳出黏在後面的所有積木)。", + "block-cherry-picking/@info-flipControls": "如果啟用「功能反轉」,那麼拖曳單個積木就會變成預設動作,按住 Ctrl 則會變成拖曳整個程式區塊。", + "block-cherry-picking/@info-macContextDisabled": "在 macOS 上,用 Cmd 鍵代替 Ctrl 鍵。", + "block-cherry-picking/@name": "按住 Ctrl 鍵拖曳單個程式積木", + "block-cherry-picking/@settings-name-invertDrag": "功能反轉", + "hide-new-variables/@description": "建立新的變數後,不要自動在舞台上顯示變數面板(清單也適用)。", + "hide-new-variables/@name": "隱藏新的變數面板", + "editor-extra-keys/@description": "添加更多的鍵到“key () pressed?” 和“按下 () 鍵時”,例如'enter'、點、逗號等。 這些鍵甚至對沒有 Scratch Addons 的用戶也有效。", + "editor-extra-keys/@info-experimentalKeysWarn": "「實驗中按鍵」包含等號、斜槓號、分號等。它們可能不適用於所有操作系統或是鍵盤佈局。", + "editor-extra-keys/@info-shiftKeysWarn": "「Shift 按鍵」通常是結合鍵,像是 Shift+數字鍵,像是井字符號、感嘆號等。這些按鍵僅適用於「當()鍵被按下」積木,而且也不一定能在所有操作系統或鍵盤佈局上使用。", + "editor-extra-keys/@name": "額外的按鈕選項", + "editor-extra-keys/@settings-name-experimentalKeys": "顯示實驗鍵", + "editor-extra-keys/@settings-name-shiftKeys": "顯示 shift 按鈕 ", + "hide-delete-button/@description": "隱藏角色、造型、音效上的刪除按鈕(垃圾桶圖示)。如果要刪除,要在項目上點擊滑鼠右鍵,使用選單上的刪除功能。", + "hide-delete-button/@name": "隱藏刪除按鈕", + "hide-delete-button/@settings-name-costumes": "造型與背景", + "hide-delete-button/@settings-name-sounds": "音效", + "hide-delete-button/@settings-name-sprites": "角色", + "no-script-bumping/@description": "讓你在移動或修改程式時,不會因為一時的程式重疊導致程式原來的位置被亂改變。", + "no-script-bumping/@name": "停止自動分開重疊的程式", + "disable-stage-drag-select/@description": "移除原來在編輯器上可以任意拖曳舞台上的角色的功能。除非設定該角色為可拖曳,或是你可以按住 Shift 鍵加以拖曳。", + "disable-stage-drag-select/@name": "編輯器內不可拖曳角色", + "move-to-top-bottom/@description": "在造型或是音效項目右鍵開啟選單時,會有移至最上面、移至最下面的選項。", + "move-to-top-bottom/@info-developer-tools": "這個擴充功能之前是在「開發工具」裡,現在移至這兒了!", + "move-to-top-bottom/@name": "移至最上面或最下面", + "disable-paste-offset/@description": "在造型編輯器上使用複製貼上功能時,在原位置貼上,不要向右下偏移。", + "disable-paste-offset/@info-vanilla": "在沒有此Addon的情況下,也可以通過 Alt+click來做這件事。", + "disable-paste-offset/@name": "複製圖案時不要偏移", + "block-duplicate/@description": "透過按住 Alt 按鍵與拖曳程式積木,能讓你更快的複製整個程式區塊。加上 Ctrl 鍵則可以複製出你停駐的單個積木。", + "block-duplicate/@info-mac": "macOS 上使用 Option 按鍵代替 Alt 鍵,Command 鍵取代 Ctrl 鍵。", + "block-duplicate/@name": "按住 Alt 鍵以複製積木", + "rename-broadcasts/@description": "添加一個選項以在boardcasts塊的下拉列表中重命名廣播消息的名字。", + "rename-broadcasts/@name": "重新命名廣播訊息", + "swap-local-global/@description": "在本來的重新命名變數或清單的面板上添加了更多功能:在「適用於所有角色」和「僅適用當前角色」之間轉換。也可以用滑鼠右鍵點擊變數,在功能表中直接轉換。", + "swap-local-global/@name": "在「適用於所有角色」和「僅適用當前角色」之間轉換", + "editor-comment-previews/@description": "當你把游標停駐在積木或者摺疊的註解上,能夠馬上預覽到註解的內容。當連接的註解離積木太遠,或是很多註解需要摺疊時,這會很有用。", + "editor-comment-previews/@name": "預覽註解", + "editor-comment-previews/@settings-name-delay": "延遲時間", + "editor-comment-previews/@settings-name-follow-mouse": "跟隨滑鼠游標", + "editor-comment-previews/@settings-name-hover-view": "停駐在已摺疊註解時預覽內容", + "editor-comment-previews/@settings-name-hover-view-block": "停駐在已連接註解的積木上時預覽註解內容", + "editor-comment-previews/@settings-name-hover-view-procedure": "停駐在函式積木上時顯示定義的註解內容", + "editor-comment-previews/@settings-name-reduce-animation": "減少彈出動畫", + "editor-comment-previews/@settings-name-reduce-transparency": "減少透明度", + "editor-comment-previews/@settings-select-delay-long": "較長", + "editor-comment-previews/@settings-select-delay-none": "無", + "editor-comment-previews/@settings-select-delay-short": "較短", + "columns/@description": "把工具箱的積木分類改成兩列顯示,並把面板放置在編輯器頂部,就像 Scratch 2.0 版那樣。", + "columns/@name": "兩列式積木選單", + "number-pad/@name": "一直顯示數字鍵盤", + "script-snap/@description": "在程式編輯區上拖曳程式時,會自動與畫面的網格貼齊。", + "script-snap/@name": "程式積木貼齊網格", + "script-snap/@preset-name-default": "預設", + "script-snap/@preset-name-half-block": "半個積木", + "script-snap/@preset-name-whole-block": "整個積木", + "script-snap/@settings-name-grid": "格點間距(像素)", + "fullscreen/@description": "修復了一些全屏顯示模式下的一些問題,讓全屏時同時讓瀏覽器也以全屏展開,且可以選擇隱藏綠旗等工具列。", + "fullscreen/@info-hideToolbarNotice": "如果你啟用全屏時隱藏工具列,你可以用 ESC 鍵來退出全屏模式。", + "fullscreen/@name": "增強全屏", + "fullscreen/@settings-name-browserFullscreen": "全屏模式時同時讓瀏覽器進入全屏", + "fullscreen/@settings-name-hideToolbar": "全屏模式時隱藏工具列", + "hide-stage/@description": "在專案預覽視窗上添加一個按鈕,用來隱藏舞台和角色面板,按鈕按鈕後能讓編輯區的空間變大。", + "hide-stage/@name": "添加隱藏舞台與角色面板按鈕", + "editor-stepping/@description": "專案運行時,以顏色高亮正在執行的程式積木。", + "editor-stepping/@name": "高亮執行中的程式", + "editor-stepping/@settings-name-highlight-color": "高亮顏色" +} \ No newline at end of file diff --git a/src/addons/addons-l10n/de.json b/src/addons/addons-l10n/de.json new file mode 100644 index 0000000000000000000000000000000000000000..8e298fbb852055dc55591038001695566479d031 --- /dev/null +++ b/src/addons/addons-l10n/de.json @@ -0,0 +1,236 @@ +{ + "editor-devtools/clean-plus": "Blöcke aufräumen +", + "editor-devtools/copy-all": "Alle Kopieren", + "editor-devtools/copy-block": "Kopieren", + "editor-devtools/cut-block": "Ausschneiden", + "editor-devtools/lists": "Listen", + "editor-devtools/make-space": "Platz machen", + "editor-devtools/orphaned": "{count, plural, one {1 alleinstehenden Variablenblock löschen?} other {# alleinstehende Variablenblöcke löschen?} }", + "editor-devtools/paste": "Einfügen", + "editor-devtools/replace": "Alle {name} in dieser Figur austauschen mit der Variable namens:", + "editor-devtools/swap": "{var} in dieser Figur austauschen", + "editor-devtools/unused-list": "{count, plural, one {1 unbenutzte lokale Liste entfernen? Hier ist sie:\n} other {# unbenutzte lokale Listen entfernen? Hier sind sie:\n} }", + "editor-devtools/unused-var": "{count, plural, one {1 unbenutzte lokale Variable löschen? Hier ist sie:\n} other {# unbenutzte lokale Variablen löschen? Hier sind sie:\n} }", + "editor-devtools/var-not-exist": "Diese Variable existiert nicht...", + "editor-devtools/variables": "Variablen", + "find-bar/complex-broadcast": "(Parameter)", + "find-bar/find-placeholder": "Finden (Strg+F)", + "middle-click-popup/start-typing": "Beginne mit der EIngabe...", + "editor-searchable-dropdowns/createBroadcast": "Nachricht „{name}“ erstellen", + "editor-searchable-dropdowns/createGlobalList": "Liste „{name}“ für alle Figuren erstellen", + "editor-searchable-dropdowns/createGlobalVariable": "Variable „{name}“ für alle Figuren erstellen", + "editor-searchable-dropdowns/createLocalList": "Liste „{name}“ nur für diese Figur erstellen", + "editor-searchable-dropdowns/createLocalVariable": "Variable „{name}“ nur für diese Figur erstellen", + "data-category-tweaks-v2/for-all-sprites": "Für alle Figuren:", + "data-category-tweaks-v2/for-this-sprite-only": "Nur für diese Figur:", + "data-category-tweaks-v2/list-category": "Listen", + "hide-flyout/lock": "Palette fixieren", + "hide-flyout/unlock": "Palette loslösen", + "mediarecorder/cancel": "Abbrechen", + "mediarecorder/click-flag": "Warte...", + "mediarecorder/click-flag-description": "Klicke die Grüne Flagge, um die Aufnahme zu starten. Klicke auf diesen Button, um sie zu beenden.", + "mediarecorder/option-title": "Aufnahmeoptionen", + "mediarecorder/record": "Aufnehmen", + "mediarecorder/record-after-flag": "Aufnahme erst starten, wenn die Grüne Flagge angeklickt wird", + "mediarecorder/record-audio": "Projektklänge einschließen", + "mediarecorder/record-audio-description": "Dies schließt Text zu Sprache nicht ein.", + "mediarecorder/record-description": "Die Bühne als WebM-Datei aufnehmen. Du kannst sie nach der Aufnahme auf deinem Computer speichern.\nAnmerkung: Variablen- und Listenanzeigen werden im Video nicht sichtbar sein.", + "mediarecorder/record-duration": "Aufnahmedauer (in Sekunden)", + "mediarecorder/record-mic": "Mikrofonklänge einschließen", + "mediarecorder/record-until-stop": "Aufnahme anhalten, wenn das Projekt gestoppt wird", + "mediarecorder/record-until-stop-disabled": "Du musst \"{afterFlagOption}\" aktivieren um diese Option zu verwenden.", + "mediarecorder/start": "Starten", + "mediarecorder/start-delay": "Startverzögerung (in Sekunden)", + "mediarecorder/starting-in": "Startet in {secs}...", + "mediarecorder/stop": "Aufnahme stoppen", + "debugger/block-breakpoint": "unterbrechen", + "debugger/block-error": "schreibe Fehler %s im Log", + "debugger/block-log": "schreibe %s im Log", + "debugger/block-warn": "schreibe Warnung %s im Log", + "debugger/cannot-pause-player": "Der \"unterbrechen\"-Block kann nur im Editor verwendet werden.", + "debugger/clear": "Löschen", + "debugger/clone-of": "Klon von {sprite}", + "debugger/close": "Schließen", + "debugger/debug": "Debuggen", + "debugger/empty-string": "(leerer Text)", + "debugger/enter-format": "Exportformat eingeben:", + "debugger/export": "Exportieren", + "debugger/export-desc": "Halte die Umschalttaste während dem Klicken gedrückt, um das Exportformat anzupassen.", + "debugger/icon-error": "Fehler", + "debugger/icon-warn": "Warnung", + "debugger/log-msg-broadcasted": "Nachricht '{broadcast}' gesendet.", + "debugger/log-msg-clone-cap": "Klonen von '{sprite}' fehlgeschlagen, es können nicht mehr als 300 Klone erzeugt werden.", + "debugger/log-msg-clone-created": "'{sprite}' geklont.", + "debugger/log-msg-flag-clicked": "Grüne Flagge angeklickt.", + "debugger/no-logs": "Es gibt keine Logs zum Anzeigen.", + "debugger/no-threads-running": "Es werden momentan keine Threads ausgeführt.", + "debugger/step": "Schritt", + "debugger/step-desc": "Führt einen Block aus.", + "debugger/unknown-sprite": "(unbekannte Figur)", + "debugger/unpause": "Fortsetzen", + "clones/clones": "Klone: {cloneCount}", + "color-picker/hex": "Hexadezimal-Farbe", + "remove-sprite-confirm/confirm": "Möchtest du diese Figur löschen?", + "block-count/blocks": "{num, plural, one {1 Block} other {# Blöcke}}", + "onion-skinning/behind": "Hinten", + "onion-skinning/front": "Vorne", + "onion-skinning/layering": "Schichtung", + "onion-skinning/merge": "Mischen", + "onion-skinning/mode": "Modus", + "onion-skinning/next": "Nächstes Kostüm", + "onion-skinning/opacity": "Transparenz (%)", + "onion-skinning/opacityStep": "Transparenz-Abstufung (%)", + "onion-skinning/previous": "Vorheriges Kostüm", + "onion-skinning/settings": "Einstellungen für Onion Skinning", + "onion-skinning/tint": "Färbung", + "onion-skinning/toggle": "Onion Skinning umschalten", + "paint-snap/boxCenter": "Auswahlmitte", + "paint-snap/boxCorners": "Auswahlecken", + "paint-snap/boxEdgeMids": "Mittelpunkte von Auswahlrändern", + "paint-snap/objectCenters": "Objektmitten", + "paint-snap/objectCorners": "Objektecken", + "paint-snap/objectEdges": "Objektecken", + "paint-snap/objectMidlines": "Objektmittellinien", + "paint-snap/off": "Aus", + "paint-snap/on": "Ein", + "paint-snap/pageAxes": "X- und Y- Achsen der Seite ", + "paint-snap/pageCenter": "Seitenmitte", + "paint-snap/pageCorners": "Seitenecken", + "paint-snap/pageEdges": "Seitenrand", + "paint-snap/settings": "Einstellungen für Einrasten", + "paint-snap/snapFrom": "Einrasten von:", + "paint-snap/snapTo": "Einrasten an:", + "paint-snap/threshold": "Einrasteabstand", + "paint-snap/toggle": "Einrasten umschalten", + "2d-color-picker/shade": "Schattieren", + "better-img-uploads/upload": "In HD hochalden", + "variable-manager/for-all-sprites": "Variablen für alle Figuren", + "variable-manager/for-this-sprite": "Variablen für diese Figur", + "variable-manager/search": "Suchen", + "variable-manager/too-big": "Klicke hier, um diesen langen Wert anzuzeigen.", + "variable-manager/variables": "Variablen", + "search-sprites/placeholder": "Figuren suchen", + "sprite-properties/close-properties-panel-tooltip": "Eigenschaften schließen", + "sprite-properties/open-properties-panel-tooltip": "Eigenschaften öffnen", + "gamepad/axes-a-b": "Achsen {a} & {b}", + "gamepad/axis-arrows": "Pfeiltasten", + "gamepad/axis-custom": "Benutzerdefiniert", + "gamepad/axis-none": "Keine", + "gamepad/browser-support": "Dieser Browser und dieses Betriebssystem haben bekannte Bugs, die die Verwendung dieses Addons erschweren könnten. Versuche einen anderen Browser, falls du auf Probleme stößt.", + "gamepad/button-n": "Knopf {n}", + "gamepad/clear": "Alle Steuerungen löschen", + "gamepad/config-header": "Dieser Kommentar enthält die Konfiguration für Gamepad-Steuerung in Tools von Drittanbietern oder Websites wie https://turbowarp.org/\nNicht eigenhändig bearbeiten", + "gamepad/key-click": "Klicken", + "gamepad/key-down": "Unten", + "gamepad/key-left": "Links", + "gamepad/key-none": "(keine)", + "gamepad/key-right": "Rechts", + "gamepad/key-space": "Leertaste", + "gamepad/key-up": "Oben", + "gamepad/keyinput-title": "Klicke und drücke eine Taste oder klicke, um Knopf zu wechseln. Drücke Esc zum abbrechen. Löschen oder Entf zum Löschen.", + "gamepad/no-controllers": "Keine Controller gefunden. Schließe einen an und drücke einen der Knöpfe.", + "gamepad/reset": "Alle Steuerungen zu Projektstandards zurücksetzen", + "gamepad/settings": "Gamepad-Einstellungen", + "gamepad/store-in-project": "Speichere diese Einstellungen im Projekt, um die Standardkonfiguration zu ersetzen (Experimentelles Werkzeug für Projektentwickler)", + "folders/add-to-folder": "zu Ordner \"{folder}\" hinzufügen", + "folders/closed-folder": "Ordner", + "folders/confirm-backpack-folder": "Den ganzen Ordner im Lager speichern?", + "folders/create-folder": "neuer Ordner", + "folders/name-not-allowed": "Ungültiger Ordnername", + "folders/name-prompt": "Ordnername:", + "folders/name-prompt-title": "Neuer Ordner", + "folders/open-folder": "Offen", + "folders/remove-folder": "Ordner entfernen", + "folders/remove-from-folder": "vom Ordner entfernen", + "folders/rename-folder": "Ordner umbenennen", + "folders/rename-folder-prompt": "Ordner umbenennen in:", + "folders/rename-folder-prompt-title": "Ordner umbenennen", + "block-switching/control_forever": "wiederhole fortlaufend", + "block-switching/control_if": "falls, dann", + "block-switching/control_if_else": "falls, dann... sonst", + "block-switching/control_repeat_until": "wiederhole bis", + "block-switching/control_wait_until": "warte bis", + "block-switching/data_changevariableby": "ändere Variable um", + "block-switching/data_hidelist": "verstecke Liste", + "block-switching/data_hidevariable": "verstecke Variable", + "block-switching/data_insertatlist": "füge Element ein", + "block-switching/data_replaceitemoflist": "ersetze Element", + "block-switching/data_setvariableto": "setze Variable auf", + "block-switching/data_showlist": "zeige Liste", + "block-switching/data_showvariable": "zeige Variable", + "block-switching/debugger_error": "Fehler im Log schreiben", + "block-switching/debugger_log": "im Log schreiben", + "block-switching/debugger_warn": "Warnung im Log schreiben", + "block-switching/event_broadcast": "sende an alle", + "block-switching/event_broadcastandwait": "sende an alle und warte", + "block-switching/looks_backdropnumbername": "Bühnenbildnummer oder -name", + "block-switching/looks_changeeffectby": "ändere Effekt um", + "block-switching/looks_changesizeby": "ändere Größe um", + "block-switching/looks_costumenumbername": "Kostümnummer oder -name", + "block-switching/looks_hide": "verstecke dich", + "block-switching/looks_nextbackdrop": "nächstes Bühnenbild", + "block-switching/looks_nextcostume": "nächstes Kostüm", + "block-switching/looks_say": "sage", + "block-switching/looks_sayforsecs": "sage für Sekunden", + "block-switching/looks_seteffectto": "setze Effekt auf", + "block-switching/looks_setsizeto": "setze Größe auf", + "block-switching/looks_show": "zeige dich", + "block-switching/looks_switchbackdropto": "wechsle zu Bühnenbild", + "block-switching/looks_switchbackdroptoandwait": "wechsle zu Bühnenbild und warte", + "block-switching/looks_think": "denke", + "block-switching/looks_thinkforsecs": "denke für Sekunden", + "block-switching/motion_changexby": "ändere x um", + "block-switching/motion_changeyby": "ändere y um", + "block-switching/motion_setx": "setze x auf", + "block-switching/motion_sety": "setze y auf", + "block-switching/motion_turnleft": "drehe dich nach links", + "block-switching/motion_turnright": "drehe dich nach rechts", + "block-switching/motion_xposition": "x-Position", + "block-switching/motion_yposition": "y-Position", + "block-switching/music_changeTempo": "ändere Tempo um", + "block-switching/music_setTempo": "setze Tempo auf", + "block-switching/operator_and": "und", + "block-switching/operator_or": "oder", + "block-switching/pen_changePenColorParamBy": "ändere Parameter", + "block-switching/pen_changePenHueBy": "ändere Farbton um", + "block-switching/pen_changePenShadeBy": "ändere Helligkeit um", + "block-switching/pen_changePenSizeBy": "ändere Größe um", + "block-switching/pen_penDown": "schalte Stift ein", + "block-switching/pen_penUp": "schalte Stift aus", + "block-switching/pen_setPenColorParamTo": "setze Parameter auf", + "block-switching/pen_setPenHueToNumber": "setze Farbton auf", + "block-switching/pen_setPenShadeToNumber": "setze Helligkeit auf", + "block-switching/pen_setPenSizeTo": "setze Größe auf", + "block-switching/sensing_mousex": "Maus-x-Position", + "block-switching/sensing_mousey": "Maus-y-Position", + "block-switching/sound_changeeffectby": "ändere Effekt um", + "block-switching/sound_changevolumeby": "ändere Lautstärke um", + "block-switching/sound_play": "Start", + "block-switching/sound_playuntildone": "spiele Klang ganz", + "block-switching/sound_seteffectto": "setze Effekt auf", + "block-switching/sound_setvolumeto": "setze Lautstärke auf", + "blocks2image/error_blocks_not_added": "Füge Blöcke zum Arbeitsbereich hinzu!", + "blocks2image/export_all_to_PNG": "Alle als PNG exportieren", + "blocks2image/export_all_to_SVG": "Alle als SVG exportieren", + "blocks2image/export_selected_to_PNG": "Exportiere Block als PNG", + "blocks2image/export_selected_to_SVG": "Block als SVG exportieren", + "editor-extra-keys/enter-key": "Enter", + "move-to-top-bottom/bottom": "an letzte Stelle verschieben", + "move-to-top-bottom/top": "an erste Stelle verschieben", + "rename-broadcasts/RENAME_BROADCAST": "Nachricht umbenennen", + "rename-broadcasts/RENAME_BROADCAST_MODAL_TITLE": "Nachricht umbenennen", + "rename-broadcasts/RENAME_BROADCAST_TITLE": "Alle \"{name}\"-Nachrichten umbenennen nach:", + "swap-local-global/cant-convert-cloud": "Cloudvariablen können nicht in nur für diese Figur umgewandelt werden.", + "swap-local-global/cant-convert-conflict": "Konnte nicht umwandeln, weil Konflikte mit Variablen in einer anderen Figur auftreten würden: {sprites}", + "swap-local-global/cant-convert-stage": "Die Bühne kann nicht Variablen nur für diese Figur haben.", + "swap-local-global/cant-convert-to-local": "Konnte nicht umwandeln, weil sie von mehreren Figuren verwendet wird: {sprites}", + "swap-local-global/cant-convert-used-elsewhere": "Konnte nicht umwandeln, weil sie von einer anderen Figur verwendet wird: {sprite}", + "swap-local-global/edit": "Eigenschaften bearbeiten:", + "swap-local-global/edit-list-header": "Liste bearbeiten", + "swap-local-global/edit-list-option": "Liste umbenennen oder bearbeiten", + "swap-local-global/edit-variable-header": "Variable bearbeiten", + "swap-local-global/edit-variable-option": "Variable bearbeiten oder umbenennen", + "swap-local-global/to-global": "In \"Für alle Figuren\" umwandeln", + "swap-local-global/to-local": "In \"Nur für diese Figur\" umwandeln", + "hide-stage/hide-stage": "Bühne ausblenden" +} \ No newline at end of file diff --git a/src/addons/addons-l10n/en.json b/src/addons/addons-l10n/en.json new file mode 100644 index 0000000000000000000000000000000000000000..1239b4998265e58e94ac8a082aec1d504c5604ee --- /dev/null +++ b/src/addons/addons-l10n/en.json @@ -0,0 +1,263 @@ +{ + "editor-devtools/clean-plus": "Clean up Blocks +", + "editor-devtools/copy-all": "Copy All", + "editor-devtools/copy-block": "Copy Block", + "editor-devtools/cut-block": "Cut Block", + "editor-devtools/lists": "lists", + "editor-devtools/make-space": "Make Space", + "editor-devtools/orphaned": "{count, plural, one {Developer tools: Delete 1 orphaned reporter block?} other {Developer tools: Delete # orphaned reporter blocks?} }", + "editor-devtools/paste": "Paste", + "editor-devtools/replace": "Developer tools: Switch all {name} in this sprite for the variable named:", + "editor-devtools/swap": "Swap {var} in Sprite", + "editor-devtools/unused-list": "{count, plural, one {Developer tools: Delete 1 unused local list? Here it is:\n} other {Developer tools: Delete # unused local lists? Here they are:\n} }", + "editor-devtools/unused-var": "{count, plural, one {Developer tools: Delete 1 unused local variable? Here it is:\n} other {Developer tools: Delete # unused local variables? Here they are:\n} }", + "editor-devtools/var-not-exist": "That variable does not exist...", + "editor-devtools/variables": "variables", + "find-bar/complex-broadcast": "(expression)", + "find-bar/find-placeholder": "Find (Ctrl+F)", + "middle-click-popup/start-typing": "Start Typing...", + "editor-searchable-dropdowns/createBroadcast": "Create message \"{name}\"", + "editor-searchable-dropdowns/createGlobalList": "Create list \"{name}\" for all sprites", + "editor-searchable-dropdowns/createGlobalVariable": "Create variable \"{name}\" for all sprites", + "editor-searchable-dropdowns/createLocalList": "Create list \"{name}\" for this sprite only", + "editor-searchable-dropdowns/createLocalVariable": "Create variable \"{name}\" for this sprite only", + "data-category-tweaks-v2/for-all-sprites": "For all sprites:", + "data-category-tweaks-v2/for-this-sprite-only": "For this sprite only:", + "data-category-tweaks-v2/list-category": "Lists", + "hide-flyout/lock": "Lock Palette", + "hide-flyout/unlock": "Unlock Palette", + "mediarecorder/cancel": "Cancel", + "mediarecorder/click-flag": "Waiting...", + "mediarecorder/click-flag-description": "Click the green flag to start recording. Click this button to stop.", + "mediarecorder/option-title": "Record Options", + "mediarecorder/record": "Record", + "mediarecorder/record-after-flag": "Do not start recording until the Green Flag is clicked", + "mediarecorder/record-audio": "Include project sounds", + "mediarecorder/record-audio-description": "This does not include Text-to-Speech.", + "mediarecorder/record-description": "Record the stage as an MP4 or WebM file. You can save it to your computer after the recording is finished.\nNote: variable and list monitors will not be visible.", + "mediarecorder/record-duration": "Record Duration (in seconds)", + "mediarecorder/record-mic": "Include sounds from microphone", + "mediarecorder/record-until-stop": "Stop recording after the project has stopped", + "mediarecorder/record-until-stop-disabled": "You need to enable \"{afterFlagOption}\" to use this option.", + "mediarecorder/start": "Start", + "mediarecorder/start-delay": "Start Delay (in seconds)", + "mediarecorder/starting-in": "Starting in {secs}...", + "mediarecorder/stop": "Stop Recording", + "debugger/block-breakpoint": "breakpoint", + "debugger/block-error": "error %s", + "debugger/block-log": "log %s", + "debugger/block-warn": "warn %s", + "debugger/cannot-pause-player": "Breakpoint block can only be used while on the editor.", + "debugger/clear": "Clear", + "debugger/clone-of": "Clone of {sprite}", + "debugger/close": "Close", + "debugger/console": "Logs", + "debugger/debug": "Debug", + "debugger/empty-string": "(empty string)", + "debugger/enter-format": "Enter export format:", + "debugger/export": "Export", + "debugger/export-desc": "Click while holding Shift to customize export format.", + "debugger/icon-error": "Error", + "debugger/icon-warn": "Warning", + "debugger/log-msg-broadcasted": "Broadcasted '{broadcast}'.", + "debugger/log-msg-clone-cap": "Failed to create clone of '{sprite}', cannot create over 300 clones.", + "debugger/log-msg-clone-created": "Created clone of '{sprite}'.", + "debugger/log-msg-flag-clicked": "Green flag clicked.", + "debugger/no-logs": "There are no logs to display.", + "debugger/no-threads-running": "No threads running.", + "debugger/step": "Step", + "debugger/step-desc": "Executes one block.", + "debugger/tab-logs": "Logs", + "debugger/tab-threads": "Threads", + "debugger/thread": "Thread {id}", + "debugger/unknown-sprite": "(unknown sprite)", + "debugger/unpause": "Resume", + "pause/pause": "Pause", + "clones/clones": "clones: {cloneCount}", + "color-picker/hex": "hex color", + "remove-sprite-confirm/confirm": "Do you want to delete the sprite?", + "block-count/blocks": "{num, plural, one {1 block} other {# blocks}}", + "onion-skinning/behind": "Behind", + "onion-skinning/front": "Front", + "onion-skinning/layering": "Layering", + "onion-skinning/merge": "Merge", + "onion-skinning/mode": "Mode", + "onion-skinning/next": "Next costumes", + "onion-skinning/opacity": "Opacity (%)", + "onion-skinning/opacityStep": "Opacity step (%)", + "onion-skinning/previous": "Previous costumes", + "onion-skinning/settings": "Onion Skinning Settings", + "onion-skinning/tint": "Tint", + "onion-skinning/toggle": "Toggle Onion Skinning", + "paint-snap/boxCenter": "Center of selection", + "paint-snap/boxCorners": "Corners of selection", + "paint-snap/boxEdgeMids": "Selection edge midpoints", + "paint-snap/objectCenters": "Centers of objects", + "paint-snap/objectCorners": "Corners of objects", + "paint-snap/objectEdges": "Edges of objects", + "paint-snap/objectMidlines": "Midlines of objects", + "paint-snap/off": "Off", + "paint-snap/on": "On", + "paint-snap/pageAxes": "Page x and y axes", + "paint-snap/pageCenter": "Center of the page", + "paint-snap/pageCorners": "Corners of the page", + "paint-snap/pageEdges": "Edges of the page", + "paint-snap/settings": "Snap Settings", + "paint-snap/snapFrom": "Snap from:", + "paint-snap/snapTo": "Snap to:", + "paint-snap/threshold": "Snapping distance", + "paint-snap/toggle": "Toggle Snapping", + "2d-color-picker/shade": "Shade", + "better-img-uploads/upload": "HD Upload", + "variable-manager/for-all-sprites": "Variables for all sprites", + "variable-manager/for-this-sprite": "Variables for this sprite", + "variable-manager/search": "Search", + "variable-manager/too-big": "Click to display very large value.", + "variable-manager/variables": "Variables", + "search-sprites/placeholder": "Search sprites...", + "sprite-properties/close-properties-panel-tooltip": "Collapse properties panel", + "sprite-properties/open-properties-panel-tooltip": "Open properties panel", + "gamepad/axes-a-b": "Axes {a} & {b}", + "gamepad/axis-arrows": "Arrow Keys", + "gamepad/axis-cursor": "Cursor", + "gamepad/axis-custom": "Custom", + "gamepad/axis-none": "None", + "gamepad/browser-support": "This browser and operating system have known bugs that may make this addon difficult to use. Try another browser if you encounter problems.", + "gamepad/button-n": "Button {n}", + "gamepad/clear": "Clear all controls", + "gamepad/config-header": "This comment contains configuration for gamepad support in third-party tools or websites such as https://turbowarp.org/\nDo not edit by hand", + "gamepad/key-click": "Click", + "gamepad/key-down": "Down", + "gamepad/key-enter": "Enter", + "gamepad/key-left": "Left", + "gamepad/key-none": "(none)", + "gamepad/key-right": "Right", + "gamepad/key-space": "Space", + "gamepad/key-up": "Up", + "gamepad/keyinput-title": "Click and press a key or click to change button. Escape to cancel. Backspace or delete to clear.", + "gamepad/no-controllers": "No controllers detected. Try plugging one in and pressing a button on it.", + "gamepad/reset": "Reset all controls to project defaults", + "gamepad/settings": "Gamepad Settings", + "gamepad/store-in-project": "Store these settings in the project to override the default configuration (Experimental tool for project creators)", + "folders/add-to-folder": "add to folder: {folder}", + "folders/closed-folder": "Folder", + "folders/confirm-backpack-folder": "Save entire folder to backpack?", + "folders/create-folder": "create folder", + "folders/name-not-allowed": "Invalid folder name", + "folders/name-prompt": "Name of folder:", + "folders/name-prompt-title": "Create Folder", + "folders/open-folder": "Opened", + "folders/remove-folder": "remove folder", + "folders/remove-from-folder": "remove from folder", + "folders/rename-folder": "rename folder", + "folders/rename-folder-prompt": "Rename folder to:", + "folders/rename-folder-prompt-title": "Rename Folder", + "block-switching/control_forever": "forever", + "block-switching/control_if": "if", + "block-switching/control_if_else": "if... else", + "block-switching/control_repeat_until": "repeat until", + "block-switching/control_while": "while", + "block-switching/control_wait_until": "wait until", + "block-switching/data_changevariableby": "change variable", + "block-switching/data_deletealloflist": "delete all", + "block-switching/data_deleteoflist": "delete item", + "block-switching/data_hidelist": "hide list", + "block-switching/data_hidevariable": "hide variable", + "block-switching/data_insertatlist": "insert item", + "block-switching/data_replaceitemoflist": "replace item", + "block-switching/data_setvariableto": "set variable", + "block-switching/data_showlist": "show list", + "block-switching/data_showvariable": "show variable", + "block-switching/debugger_error": "error", + "block-switching/debugger_log": "log", + "block-switching/debugger_warn": "warn", + "block-switching/event_broadcast": "broadcast", + "block-switching/event_broadcastandwait": "broadcast and wait", + "block-switching/looks_backdropnumbername": "backdrop number or name", + "block-switching/looks_changeeffectby": "change effect", + "block-switching/looks_changesizeby": "change size", + "block-switching/looks_costumenumbername": "costume number or name", + "block-switching/looks_goforwardbackwardlayers": "go forward or backward layers", + "block-switching/looks_gotofrontback": "go to front or back layer", + "block-switching/looks_hide": "hide", + "block-switching/looks_nextbackdrop": "next backdrop", + "block-switching/looks_nextcostume": "next costume", + "block-switching/looks_say": "say", + "block-switching/looks_sayforsecs": "say for seconds", + "block-switching/looks_seteffectto": "set effect", + "block-switching/looks_setsizeto": "set size", + "block-switching/looks_show": "show", + "block-switching/looks_switchbackdropto": "switch backdrop", + "block-switching/looks_switchbackdroptoandwait": "switch backdrop and wait", + "block-switching/looks_think": "think", + "block-switching/looks_thinkforsecs": "think for seconds", + "block-switching/motion_changexby": "change x", + "block-switching/motion_changeyby": "change y", + "block-switching/motion_setx": "set x", + "block-switching/motion_sety": "set y", + "block-switching/motion_changebyxy": "change by x y", + "block-switching/motion_gotoxy": "goto x y", + "block-switching/motion_turnleft": "turn left", + "block-switching/motion_turnright": "turn right", + "block-switching/motion_xposition": "x position", + "block-switching/motion_yposition": "y position", + "block-switching/music_changeTempo": "change tempo", + "block-switching/music_setTempo": "set tempo", + "block-switching/operator_add": "+", + "block-switching/operator_and": "and", + "block-switching/operator_divide": "/", + "block-switching/operator_equals": "=", + "block-switching/operator_notequal": "≠", + "block-switching/operator_gt": ">", + "block-switching/operator_lt": "<", + "block-switching/operator_gtorequal": "≥", + "block-switching/operator_ltorequal": "≤", + "block-switching/operator_mod": "mod", + "block-switching/operator_multiply": "*", + "block-switching/operator_or": "or", + "block-switching/operator_subtract": "-", + "block-switching/operator_trueBoolean": "true", + "block-switching/operator_falseBoolean": "false", + "block-switching/operator_power": "^", + "block-switching/pen_changePenColorParamBy": "change parameter", + "block-switching/pen_changePenHueBy": "change hue", + "block-switching/pen_changePenShadeBy": "change shade", + "block-switching/pen_changePenSizeBy": "change size", + "block-switching/pen_penDown": "pen down", + "block-switching/pen_penUp": "pen up", + "block-switching/pen_setPenColorParamTo": "set parameter", + "block-switching/pen_setPenHueToNumber": "set hue", + "block-switching/pen_setPenShadeToNumber": "set shade", + "block-switching/pen_setPenSizeTo": "set size", + "block-switching/sensing_coloristouchingcolor": "color touching color", + "block-switching/sensing_mousex": "mouse x", + "block-switching/sensing_mousey": "mouse y", + "block-switching/sensing_touchingcolor": "touching color", + "block-switching/sound_changeeffectby": "change effect", + "block-switching/sound_changevolumeby": "change volume", + "block-switching/sound_play": "start", + "block-switching/sound_playuntildone": "play until done", + "block-switching/sound_seteffectto": "set effect", + "block-switching/sound_setvolumeto": "set volume", + "blocks2image/error_blocks_not_added": "Add blocks to workspace!", + "blocks2image/export_all_to_PNG": "Export all as PNG", + "blocks2image/export_all_to_SVG": "Export all as SVG", + "blocks2image/export_selected_to_PNG": "Export block as PNG", + "blocks2image/export_selected_to_SVG": "Export block as SVG", + "editor-extra-keys/enter-key": "enter", + "move-to-top-bottom/bottom": "move to bottom", + "move-to-top-bottom/top": "move to top", + "swap-local-global/cant-convert-cloud": "Cloud variables can't be converted to this sprite only.", + "swap-local-global/cant-convert-conflict": "Can't convert because it would conflict with variables in another sprite: {sprites}", + "swap-local-global/cant-convert-stage": "The stage can't have variables for this sprite only.", + "swap-local-global/cant-convert-to-local": "Can't convert because it's used by multiple sprites: {sprites}", + "swap-local-global/cant-convert-used-elsewhere": "Can't convert because it's used by another sprite: {sprite}", + "swap-local-global/edit": "Edit properties:", + "swap-local-global/edit-list-header": "Edit List", + "swap-local-global/edit-list-option": "Rename or edit list", + "swap-local-global/edit-variable-header": "Edit Variable", + "swap-local-global/edit-variable-option": "Rename or edit variable", + "swap-local-global/to-global": "Convert to \"For all sprites\"", + "swap-local-global/to-local": "Convert to \"For this sprite only\"", + "hide-stage/hide-stage": "Hide stage" +} \ No newline at end of file diff --git a/src/addons/addons-l10n/es.json b/src/addons/addons-l10n/es.json new file mode 100644 index 0000000000000000000000000000000000000000..4e16a9c963489a353d0d45887c6543d40f84c8d9 --- /dev/null +++ b/src/addons/addons-l10n/es.json @@ -0,0 +1,228 @@ +{ + "editor-devtools/clean-plus": "Ordenar Bloques +", + "editor-devtools/copy-all": "Copiar Todos", + "editor-devtools/copy-block": "Copiar Bloque", + "editor-devtools/cut-block": "Cortar Bloque", + "editor-devtools/lists": "listas", + "editor-devtools/make-space": "Hacer Espacio", + "editor-devtools/orphaned": "{count, plural, one {Herramientas de desarrollador: ¿borrar 1 bloque reportero huérfano?} many {Herramientas de desarrollador: ¿borrar # bloques reporteros huérfanos?} other {Herramientas de desarrollador: ¿borrar # bloques reporteros huérfanos?} }", + "editor-devtools/paste": "Pegar", + "editor-devtools/replace": "Herramientas de desarrollador: cambiar todos los {name} en este objeto por la variable llamada:", + "editor-devtools/swap": "Intercambiar Variable {var} en Objeto", + "editor-devtools/unused-list": "{count, plural, one {Herramientas de desarrollador: ¿borrar 1 lista local sin usar? Esta es:\n} many {Herramientas de desarrollador: ¿borrar # listas locales sin usar? Estas son:\n} other {Herramientas de desarrollador: ¿borrar # listas locales sin usar? Estas son:\n} }", + "editor-devtools/unused-var": "{count, plural, one {Herramientas de desarrollador: ¿borrar 1 variable local sin usar? Estas son:\n} many {Herramientas de desarrollador: ¿borrar # variables locales sin usar? Estas son:\n} other {Herramientas de desarrollador: ¿borrar # variables locales sin usar? Estas son:\n} }", + "editor-devtools/var-not-exist": "Esa variable no existe..", + "find-bar/complex-broadcast": "(expresión)", + "find-bar/find-placeholder": "Buscar (Ctrl+F)", + "middle-click-popup/start-typing": "Empiece a escribir...", + "editor-searchable-dropdowns/createBroadcast": "Crear mensaje \"{name}\"", + "editor-searchable-dropdowns/createGlobalList": "Crear lista \"{name}\" para todos los objetos", + "editor-searchable-dropdowns/createGlobalVariable": "Crear variable \"{name}\" para todos los objetos", + "editor-searchable-dropdowns/createLocalList": "Crear lista \"{name}\" solo para este objeto", + "editor-searchable-dropdowns/createLocalVariable": "Crear variable \"{name}\" solo para este objeto", + "data-category-tweaks-v2/for-all-sprites": "Para todos los objetos:", + "data-category-tweaks-v2/for-this-sprite-only": "Solo para este objeto:", + "data-category-tweaks-v2/list-category": "Listas", + "hide-flyout/lock": "Bloquear Paleta", + "hide-flyout/unlock": "Desbloquear Paleta", + "mediarecorder/cancel": "Cancelar", + "mediarecorder/click-flag": "Esperando...", + "mediarecorder/click-flag-description": "Haga click en la bandera verde para empezar a grabar. Haga click en este botón para parar.", + "mediarecorder/option-title": "Opciones de grabación", + "mediarecorder/record-after-flag": "No empezar grabación hasta que haga click en la Bandera Verde", + "mediarecorder/record-audio": "Incluir sonidos del proyecto", + "mediarecorder/record-audio-description": "Esto no incluye Text-to-Speech.", + "mediarecorder/record-duration": "Duración (en segundos)", + "mediarecorder/record-mic": "Incluir sonidos del micrófono", + "mediarecorder/record-until-stop": "Parar grabación luego de que el proyecto se detenga", + "mediarecorder/record-until-stop-disabled": "Debes activar \"{afterFlagOption}\" para usar esta opción.", + "mediarecorder/start": "Empezar", + "mediarecorder/start-delay": "Demora para empezar (en segundos)", + "mediarecorder/starting-in": "Empezando en {secs}...", + "mediarecorder/stop": "Detener Grabación", + "debugger/block-log": "loguear", + "debugger/block-warn": "advertir %s", + "debugger/cannot-pause-player": "El bloque breakpoint solo se puede usar mientras esté en el editor.", + "debugger/clear": "Vaciar", + "debugger/clone-of": "Clon de {sprite}", + "debugger/close": "Cerrar", + "debugger/debug": "Depurar", + "debugger/empty-string": "(string vacío)", + "debugger/enter-format": "Ingrese formato de exportación:", + "debugger/export": "Exportar", + "debugger/export-desc": "Haga click mientras mantiene Shift para personalizar el formato de exportación.", + "debugger/icon-warn": "Advertencia", + "debugger/log-msg-broadcasted": "Mensaje enviado '{broadcast}'.", + "debugger/log-msg-clone-cap": "No se pudo crear clon de '{sprite}', no se pueden crear más de 300 clones.", + "debugger/log-msg-clone-created": "Se creo un clon de '{sprite}'.", + "debugger/log-msg-flag-clicked": "Bandera verde clickeada.", + "debugger/no-logs": "No hay logs para mostrar.", + "debugger/no-threads-running": "No hay hilos ejecutándose.", + "debugger/step": "Paso", + "debugger/step-desc": "Ejecuta un bloque.", + "debugger/tab-threads": "Hilos", + "debugger/thread": "Hilo {id}", + "debugger/unknown-sprite": "(objeto desconocido)", + "debugger/unpause": "Continuar", + "pause/pause": "Pausar", + "color-picker/hex": "color hex", + "remove-sprite-confirm/confirm": "¿Quiere borrar este objeto?", + "block-count/blocks": "{num, plural, one {1 bloques} many {# bloques} other {# bloques}}", + "onion-skinning/behind": "Detrás", + "onion-skinning/front": "Frente", + "onion-skinning/layering": "Método de superposición", + "onion-skinning/merge": "Combinar", + "onion-skinning/mode": "Modo", + "onion-skinning/next": "Disfraces siguientes", + "onion-skinning/opacity": "Opacidad (%)", + "onion-skinning/opacityStep": "Salto de opacidad (%)", + "onion-skinning/previous": "Disfraces anteriores", + "onion-skinning/settings": "Ajustes de Capa Sobre Capa", + "onion-skinning/tint": "Teñir", + "onion-skinning/toggle": "Activar/desactivar capa sobre capa", + "paint-snap/boxCenter": "Centro de selección", + "paint-snap/boxCorners": "Esquinas de selección", + "paint-snap/boxEdgeMids": "Seleccionar puntos medios de lados", + "paint-snap/objectCenters": "Centros de objetos", + "paint-snap/objectCorners": "Esquinas de objetos", + "paint-snap/objectEdges": "Lados de objetos", + "paint-snap/objectMidlines": "Líneas centrales de objetos", + "paint-snap/off": "Apagado", + "paint-snap/on": "Encendido", + "paint-snap/pageAxes": "Ejes x e y de la página", + "paint-snap/pageCenter": "Centro de la página", + "paint-snap/pageCorners": "Esquinas de la página", + "paint-snap/pageEdges": "Lados de la página", + "paint-snap/settings": "Configuración de ajuste de posición", + "paint-snap/snapFrom": "Ajustar desde:", + "paint-snap/snapTo": "Ajustar a:", + "paint-snap/threshold": "Distancia de ajuste", + "paint-snap/toggle": "Alternar activación del ajuste de posición", + "2d-color-picker/shade": "Tonalidad", + "better-img-uploads/upload": "Subida HD", + "variable-manager/for-all-sprites": "Variables para todos los objetos", + "variable-manager/for-this-sprite": "Variables para este objeto", + "variable-manager/search": "Buscar", + "search-sprites/placeholder": "Buscar objetos...", + "sprite-properties/close-properties-panel-tooltip": "Colapsar panel de propiedades", + "sprite-properties/open-properties-panel-tooltip": "Abrir panel de propiedades", + "gamepad/axes-a-b": "Ejes {a} y {b}", + "gamepad/axis-arrows": "Flechas del Teclado", + "gamepad/axis-custom": "Personalizado", + "gamepad/axis-none": "Ninguno", + "gamepad/browser-support": "Este navegador y sistema operativo tienen bugs conocidos que pueden causar que este addon sea difícil de usar. Pruebe otro navegador si encuentra problemas.", + "gamepad/button-n": "Botón {n}", + "gamepad/clear": "Borrar todos los controles", + "gamepad/config-header": "Este comentario contiene configuración de soporte de mando de videojuegos para herramientas de terceros o páginas web como https://turbowarp.org/\nNo editar a mano", + "gamepad/key-down": "Abajo", + "gamepad/key-left": "Izquierda", + "gamepad/key-none": "(ninguno)", + "gamepad/key-right": "Derecha", + "gamepad/key-space": "Espacio", + "gamepad/key-up": "Arriba", + "gamepad/keyinput-title": "Haga click y presione una tecla para cambiar el botón. Esc para cancelar. Retroceso o Suprimir para borrar.", + "gamepad/no-controllers": "No se detectó ningún mando. Intente conectar uno y presionar cualquier botón de él.", + "gamepad/reset": "Restablecer todos los controles a los predeterminados del proyecto", + "gamepad/settings": "Ajustes del Mando", + "gamepad/store-in-project": "Guardar estos ajustes en el proyecto para reemplazar la configuración por defecto (herramienta experimental para creadores de proyectos)", + "folders/add-to-folder": "agregar a carpeta: {folder}", + "folders/closed-folder": "Carpeta", + "folders/confirm-backpack-folder": "¿Guardar carpeta entera en la mochila?", + "folders/create-folder": "crear carpeta", + "folders/name-not-allowed": "Nombre de carpeta inválido", + "folders/name-prompt": "Nombre de carpeta:", + "folders/name-prompt-title": "Crear Carpeta", + "folders/open-folder": "Abierta", + "folders/remove-folder": "quitar carpeta", + "folders/remove-from-folder": "quitar de carpeta", + "folders/rename-folder": "renombrar carpeta", + "folders/rename-folder-prompt": "Renombrar carpeta a:", + "folders/rename-folder-prompt-title": "Renombrar Carpeta", + "block-switching/control_forever": "por siempre", + "block-switching/control_if": "si", + "block-switching/control_if_else": "si... si no", + "block-switching/control_repeat_until": "repetir hasta que", + "block-switching/control_wait_until": "esperar hasta que", + "block-switching/data_changevariableby": "cambiar/sumar variable", + "block-switching/data_hidelist": "esconder lista", + "block-switching/data_hidevariable": "esconder variable", + "block-switching/data_insertatlist": "insertar elemento", + "block-switching/data_replaceitemoflist": "reemplazar elemento", + "block-switching/data_setvariableto": "establecer variable", + "block-switching/data_showlist": "mostrar lista", + "block-switching/data_showvariable": "mostrar variable", + "block-switching/debugger_log": "loguear", + "block-switching/debugger_warn": "advertir", + "block-switching/event_broadcast": "enviar", + "block-switching/event_broadcastandwait": "enviar y esperar", + "block-switching/looks_backdropnumbername": "número o nombre de fondo", + "block-switching/looks_changeeffectby": "cambiar/sumar efecto", + "block-switching/looks_changesizeby": "cambiar/sumar tamaño", + "block-switching/looks_costumenumbername": "número o nombre de disfraz", + "block-switching/looks_hide": "ocultar", + "block-switching/looks_nextbackdrop": "siguiente fondo", + "block-switching/looks_nextcostume": "siguiente disfraz", + "block-switching/looks_say": "decir", + "block-switching/looks_sayforsecs": "decir por segundos", + "block-switching/looks_seteffectto": "fijar efecto", + "block-switching/looks_setsizeto": "fijar tamaño", + "block-switching/looks_show": "mostrar", + "block-switching/looks_switchbackdropto": "cambiar fondo", + "block-switching/looks_switchbackdroptoandwait": "cambiar fondo y esperar", + "block-switching/looks_think": "pensar", + "block-switching/looks_thinkforsecs": "pensar por segundos", + "block-switching/motion_changexby": "cambiar/sumar x", + "block-switching/motion_changeyby": "cambiar/sumar y", + "block-switching/motion_setx": "fijar x", + "block-switching/motion_sety": "fijar y", + "block-switching/motion_turnleft": "girar a la izquierda", + "block-switching/motion_turnright": "girar a la derecha", + "block-switching/motion_xposition": "posición en x", + "block-switching/motion_yposition": "posición en y", + "block-switching/music_changeTempo": "cambiar tempo", + "block-switching/music_setTempo": "fijar tempo", + "block-switching/operator_and": "y", + "block-switching/operator_mod": "módulo", + "block-switching/operator_or": "o", + "block-switching/pen_changePenColorParamBy": "fijar parámetro", + "block-switching/pen_changePenHueBy": "cambiar/sumar matiz de color", + "block-switching/pen_changePenShadeBy": "cambiar/sumar sombra de color", + "block-switching/pen_changePenSizeBy": "cambiar/sumar tamaño", + "block-switching/pen_penDown": "bajar lápiz", + "block-switching/pen_penUp": "subir lápiz", + "block-switching/pen_setPenColorParamTo": "cambiar/sumar parámetro", + "block-switching/pen_setPenHueToNumber": "fijar matiz de color", + "block-switching/pen_setPenShadeToNumber": "fijar sombra de color", + "block-switching/pen_setPenSizeTo": "fijar tamaño", + "block-switching/sensing_mousex": "posición x del ratón", + "block-switching/sensing_mousey": "posición y del ratón", + "block-switching/sound_changeeffectby": "cambiar/sumar efecto", + "block-switching/sound_changevolumeby": "cambiar/sumar volumen", + "block-switching/sound_play": "iniciar", + "block-switching/sound_playuntildone": "tocar sonido hasta terminar", + "block-switching/sound_seteffectto": "fijar efecto", + "block-switching/sound_setvolumeto": "fijar volumen", + "blocks2image/error_blocks_not_added": "Agregue bloques al workspace", + "blocks2image/export_all_to_PNG": "Exportar todos como PNG", + "blocks2image/export_all_to_SVG": "Exportar todos como SVG", + "blocks2image/export_selected_to_PNG": "Exportar bloque como PNG", + "blocks2image/export_selected_to_SVG": "Exportar bloque como SVG", + "move-to-top-bottom/bottom": "mover al fondo", + "move-to-top-bottom/top": "movar a la cima", + "rename-broadcasts/RENAME_BROADCAST": "Renombrar mensaje", + "rename-broadcasts/RENAME_BROADCAST_MODAL_TITLE": "Renombrar Mensaje", + "rename-broadcasts/RENAME_BROADCAST_TITLE": "Renombrar todos los mensajes \"{name}\" a:", + "swap-local-global/cant-convert-cloud": "Variables en la nube no pueden ser convertidas a solo para este objeto", + "swap-local-global/cant-convert-conflict": "No se pudo convertir porque entraría en conflicto con variables en otro objeto: {sprites}", + "swap-local-global/cant-convert-stage": "El escenario no puede tener variables solo para este objeto.", + "swap-local-global/cant-convert-to-local": "No se pudo convertir porque es usado por múltiples objetos: {sprites}", + "swap-local-global/cant-convert-used-elsewhere": "No se pudo convertir porque es usado por otro objeto: {sprite}", + "swap-local-global/edit": "Editar propiedades:", + "swap-local-global/edit-list-header": "Editar Lista", + "swap-local-global/edit-list-option": "Renombrar o editar lista", + "swap-local-global/edit-variable-header": "Editar Variable", + "swap-local-global/edit-variable-option": "Renombrar o editar variable", + "swap-local-global/to-global": "Convertir a \"Para todos los objetos\"", + "swap-local-global/to-local": "Convertir a \"Solo para este objeto\"", + "hide-stage/hide-stage": "Esconder escenario" +} \ No newline at end of file diff --git a/src/addons/addons-l10n/fr.json b/src/addons/addons-l10n/fr.json new file mode 100644 index 0000000000000000000000000000000000000000..5335058cd503b4b875676cedfcce5ffc11be4435 --- /dev/null +++ b/src/addons/addons-l10n/fr.json @@ -0,0 +1,221 @@ +{ + "editor-devtools/clean-plus": "Nettoyer les blocs +", + "editor-devtools/copy-all": "Tout Copier", + "editor-devtools/copy-block": "Copier Le Bloc", + "editor-devtools/cut-block": "Couper le bloc", + "editor-devtools/lists": "listes", + "editor-devtools/make-space": "Espacer", + "editor-devtools/orphaned": "{count, plural, one {Outils développeur : Supprimer 1 bloc de valeur seul ?} many {Outils développeur : Supprimer les # blocs de valeur seuls ?} other {Outils développeur : Supprimer les # blocs de valeur seuls ?} }", + "editor-devtools/paste": "Coller", + "editor-devtools/replace": "Outils développeur : Remplacer toutes les utilisations de la variable {name} dans ce sprite par la variable nommée :", + "editor-devtools/swap": "Remplacer la variable \"{var}\" dans le sprite", + "editor-devtools/unused-list": "{count, plural, one {Outils développeur : Supprimer 1 liste locale inutilisée ? La voici :\n} many {Outils développeur : Supprimer # listes locales inutilisées ? Les voici :\n} other {Outils développeur : Supprimer # listes locales inutilisées ? Les voici :\n} }", + "editor-devtools/unused-var": "{count, plural, one {Outils développeur : Supprimer 1 variable locale inutilisée ? Là voilà :\n} many {Outils développeur : Supprimer les # variables locales inutilisées ? Les voici :\n} other {Outils développeur : Supprimer les # variables locales inutilisées ? Les voici :\n} }", + "editor-devtools/var-not-exist": "Cette variable n'existe pas...", + "find-bar/find-placeholder": "Rechercher (Ctrl + F)", + "middle-click-popup/start-typing": "Commencez à taper…", + "editor-searchable-dropdowns/createBroadcast": "Créer un message nommé \"{name}\"", + "editor-searchable-dropdowns/createGlobalList": "Créer une liste \"{name}\" pour tous les sprites", + "editor-searchable-dropdowns/createGlobalVariable": "Créer une variable \"{name}\" pour tous les sprites", + "editor-searchable-dropdowns/createLocalList": "Créer une liste \"{name}\" pour ce sprite uniquement", + "editor-searchable-dropdowns/createLocalVariable": "Créer une variable \"{name}\" pour ce sprite uniquement", + "data-category-tweaks-v2/for-all-sprites": "Pour tous les sprites :", + "data-category-tweaks-v2/for-this-sprite-only": "Pour ce sprite uniquement :", + "data-category-tweaks-v2/list-category": "Listes", + "hide-flyout/lock": "Vérouiller la palette", + "hide-flyout/unlock": "Dévérouiller la palette", + "mediarecorder/cancel": "Annuler", + "mediarecorder/click-flag": "En attente...", + "mediarecorder/click-flag-description": "Cliquez sur le drapeau vert pour démarrer l'enregistrement. Cliquez sur ce bouton pour arrêter.", + "mediarecorder/option-title": "Options d'enregistrement", + "mediarecorder/record": "Enregistrer", + "mediarecorder/record-after-flag": "Ne démarrez pas l'enregistrement tant que le drapeau vert n'est pas été cliqué", + "mediarecorder/record-audio": "Inclure les sons du projet", + "mediarecorder/record-audio-description": "Cela n'inclut pas la synthèse vocale.", + "mediarecorder/record-duration": "Durée de l'enregistrement (en secondes)", + "mediarecorder/record-mic": "Inclure les sons du microphone", + "mediarecorder/record-until-stop": "Arrêter l'enregistrement quand le projet se termine", + "mediarecorder/record-until-stop-disabled": "Vous devez activer \"{afterFlagOption}\" pour utiliser cette option.", + "mediarecorder/start": "Commencer", + "mediarecorder/start-delay": "Délai de démarrage (en secondes)", + "mediarecorder/starting-in": "Démarrage dans{secs} ...", + "mediarecorder/stop": "Arrêter l'enregistrement", + "debugger/block-breakpoint": "point d'arrêt", + "debugger/block-error": "afficher erreur %s", + "debugger/block-log": "afficher message %s", + "debugger/block-warn": "afficher avertissement %s", + "debugger/cannot-pause-player": "Le bloc de point d'arrêt ne peut être utilisé que dans l'éditeur.", + "debugger/clear": "Effacer", + "debugger/clone-of": "Clone de {sprite}", + "debugger/close": "Fermer", + "debugger/console": "Console", + "debugger/debug": "Débogage", + "debugger/empty-string": "(chaîne de caractères vide)", + "debugger/enter-format": "Entrez un format d'export :", + "debugger/export": "Exporter", + "debugger/export-desc": "Cliquez tout en maintenant la touche Maj. enfoncée pour personnaliser le format d'exportation.", + "debugger/icon-error": "Erreur", + "debugger/icon-warn": "Avertissement", + "debugger/log-msg-broadcasted": "\"{broadcast}\" envoyé à tous les sprites.", + "debugger/log-msg-clone-cap": "Échec lors de la création d'un clone de '{sprite}', car il est impossible de créer plus de 300 clones.", + "debugger/log-msg-clone-created": "Un clone de '{sprite}' a été créé.", + "debugger/log-msg-flag-clicked": "Drapeau vert cliqué.", + "debugger/no-logs": "Il y a aucune activité à montrer.", + "debugger/no-threads-running": "Aucun processus en cours d'exécution.", + "debugger/step": "Avancer", + "debugger/step-desc": "Exécute un seul bloc.", + "debugger/tab-logs": "Activités", + "debugger/tab-threads": "Processus", + "debugger/unknown-sprite": "(sprite inconnu)", + "debugger/unpause": "Reprendre", + "clones/clones": "clones : {cloneCount}", + "color-picker/hex": "couleur hexa", + "remove-sprite-confirm/confirm": "Voulez-vous supprimer le sprite ?", + "block-count/blocks": "{num, plural, one {1 bloc} many {# blocs} other {# blocs}}", + "onion-skinning/behind": "Derrière", + "onion-skinning/front": "Devant", + "onion-skinning/layering": "Calques", + "onion-skinning/merge": "Combiner", + "onion-skinning/next": "Costumes suivants", + "onion-skinning/opacity": "Opacité (%)", + "onion-skinning/opacityStep": "Différence d'opacité (%)", + "onion-skinning/previous": "Costumes précédents", + "onion-skinning/settings": "Paramètres de Pelure d'Oignon", + "onion-skinning/tint": "Teinte", + "onion-skinning/toggle": "Activer la Pelure d'Oignon", + "paint-snap/objectEdges": "Bords des objets", + "paint-snap/pageEdges": "Bords de la page", + "paint-snap/settings": "Réglages du Snap", + "paint-snap/snapTo": "Snap à :", + "2d-color-picker/shade": "Nuancier", + "better-img-uploads/upload": "Charger HD", + "variable-manager/for-all-sprites": "Variables pour tous les sprites", + "variable-manager/for-this-sprite": "Variables de ce sprite", + "variable-manager/search": "Rechercher", + "search-sprites/placeholder": "Rechercher des sprites...", + "sprite-properties/close-properties-panel-tooltip": "Réduire le panneau des propriétés", + "sprite-properties/open-properties-panel-tooltip": "Ouvrir le panneau des propriétés", + "gamepad/axis-arrows": "Flèches", + "gamepad/axis-cursor": "Curseur", + "gamepad/axis-custom": "Personnalisé", + "gamepad/axis-none": "Aucun", + "gamepad/browser-support": "Ce navigateur et ce système d'exploitation ont des bugs connus qui peuvent rendre cet addon difficile à utiliser. Essayez un autre navigateur si vous rencontrez des problèmes.", + "gamepad/button-n": "Bouton {n}", + "gamepad/clear": "Effacer tous les contrôles", + "gamepad/config-header": "Ce commentaire contient la configuration pour le support de la manette dans d'autres outils et sites web, tels que https://turbowarp.org/\nNe le modifiez pas à la main", + "gamepad/key-click": "Clic", + "gamepad/key-down": "Bas", + "gamepad/key-enter": "Entrée", + "gamepad/key-left": "Gauche", + "gamepad/key-none": "(aucun)", + "gamepad/key-right": "Droite", + "gamepad/key-space": "Espace", + "gamepad/key-up": "Haut", + "gamepad/keyinput-title": "Cliquez et appuyez sur une touche ou cliquez pour modifier le bouton. Échap pour annuler. Retour arrière ou supprimer pour effacer.", + "gamepad/no-controllers": "Aucuns contrôleurs détectés. Essayez d'en brancher un et d'appuyer sur un bouton.", + "gamepad/reset": "Réinitialiser tous les contrôles aux paramètres par défaut du projet", + "gamepad/settings": "Paramètres de la manette", + "gamepad/store-in-project": "Stockez ces paramètres dans le projet pour remplacer la configuration par défaut (Outil expérimental pour les créateurs de projets)", + "folders/add-to-folder": "ajouter au dossier : {folder}", + "folders/closed-folder": "Dossier", + "folders/confirm-backpack-folder": "Sauvegarder tout le dossier dans le sac-à-dos ?", + "folders/create-folder": "créer un dossier", + "folders/name-not-allowed": "Nom de dossier invalide", + "folders/name-prompt": "Nom du dossier :", + "folders/name-prompt-title": "Créer un dossier", + "folders/open-folder": "Ouvert", + "folders/remove-folder": "supprimer le dossier", + "folders/remove-from-folder": "supprimer du dossier", + "folders/rename-folder": "renommer le dossier", + "folders/rename-folder-prompt": "Renommer le dossier en :", + "folders/rename-folder-prompt-title": "Renommer le dossier", + "block-switching/control_forever": "répéter indéfiniment", + "block-switching/control_if": "si", + "block-switching/control_if_else": "si... sinon", + "block-switching/control_repeat_until": "répéter jusqu'à ce que", + "block-switching/control_wait_until": "attendre jusqu'à ce que", + "block-switching/data_changevariableby": "ajouter à la variable", + "block-switching/data_hidelist": "cacher la liste", + "block-switching/data_hidevariable": "cacher la variable", + "block-switching/data_insertatlist": "insérer l'élément", + "block-switching/data_replaceitemoflist": "remplacer l'élément", + "block-switching/data_setvariableto": "mettre la variable à", + "block-switching/data_showlist": "montrer la liste", + "block-switching/data_showvariable": "montrer la variable", + "block-switching/debugger_error": "erreur", + "block-switching/debugger_log": "noter", + "block-switching/debugger_warn": "avertis", + "block-switching/event_broadcast": "envoyer", + "block-switching/event_broadcastandwait": "envoyer et attendre", + "block-switching/looks_backdropnumbername": "numéro ou nom de l'arrière-plan", + "block-switching/looks_changeeffectby": "ajouter à l'effet", + "block-switching/looks_changesizeby": "ajouter à la taille", + "block-switching/looks_costumenumbername": "numéro ou nom du costume", + "block-switching/looks_hide": "cacher", + "block-switching/looks_nextbackdrop": "arrière-plan suivant", + "block-switching/looks_nextcostume": "costume suivant", + "block-switching/looks_say": "dire", + "block-switching/looks_sayforsecs": "dire pendant secondes", + "block-switching/looks_seteffectto": "mettre l'effet à", + "block-switching/looks_setsizeto": "mettre la taille à", + "block-switching/looks_show": "montrer", + "block-switching/looks_switchbackdropto": "basculer sur l'arrière-plan", + "block-switching/looks_switchbackdroptoandwait": "basculer sur l'arrière-plan et attendre", + "block-switching/looks_think": "penser à", + "block-switching/looks_thinkforsecs": "penser à pendant secondes", + "block-switching/motion_changexby": "ajouter à x", + "block-switching/motion_changeyby": "ajouter à y", + "block-switching/motion_setx": "mettre x à", + "block-switching/motion_sety": "mettre y à", + "block-switching/motion_turnleft": "tourner gauche", + "block-switching/motion_turnright": "tourner droite", + "block-switching/motion_xposition": "position x", + "block-switching/motion_yposition": "position y", + "block-switching/music_changeTempo": "ajouter au tempo", + "block-switching/music_setTempo": "mettre le tempo à", + "block-switching/operator_and": "et", + "block-switching/operator_mod": "modulo", + "block-switching/operator_or": "ou", + "block-switching/pen_changePenColorParamBy": "ajouter au paramètre", + "block-switching/pen_changePenHueBy": "ajouter à la couleur", + "block-switching/pen_changePenShadeBy": "ajouter à la luminosité", + "block-switching/pen_changePenSizeBy": "ajouter à la taille", + "block-switching/pen_penDown": "stylo en position d'écriture", + "block-switching/pen_penUp": "relever le stylo", + "block-switching/pen_setPenColorParamTo": "mettre le paramètre à", + "block-switching/pen_setPenHueToNumber": "mettre la couleur à", + "block-switching/pen_setPenShadeToNumber": "mettre la luminosité à", + "block-switching/pen_setPenSizeTo": "mettre la taille à", + "block-switching/sensing_mousex": "souris x", + "block-switching/sensing_mousey": "souris y", + "block-switching/sound_changeeffectby": "ajouter à l'effet", + "block-switching/sound_changevolumeby": "ajouter au volume", + "block-switching/sound_play": "débute", + "block-switching/sound_playuntildone": "jouer jusqu'au bout", + "block-switching/sound_seteffectto": "mettre l'effet à", + "block-switching/sound_setvolumeto": "mettre le volume à", + "blocks2image/error_blocks_not_added": "Ajoute des blocs à l'espace de travail  !", + "blocks2image/export_all_to_PNG": "Tout exporter au format PNG", + "blocks2image/export_all_to_SVG": "Tout exporter au format SVG", + "blocks2image/export_selected_to_PNG": "Exporter le bloc au format PNG", + "blocks2image/export_selected_to_SVG": "Exporter le bloc au format SVG", + "editor-extra-keys/enter-key": "entrée", + "move-to-top-bottom/bottom": "Déplacé en bas", + "move-to-top-bottom/top": "Déplacé en haut", + "rename-broadcasts/RENAME_BROADCAST": "Renommer le message", + "rename-broadcasts/RENAME_BROADCAST_MODAL_TITLE": "Renommer le message", + "rename-broadcasts/RENAME_BROADCAST_TITLE": "Renommer tous les messages \"{name}\" en :", + "swap-local-global/cant-convert-cloud": "Les variables cloud ne peuvent pas être converties uniquement dans ce sprite.", + "swap-local-global/cant-convert-conflict": "Impossible d'effectuer la conversion car cela entrerait en conflit avec les variables d'un autre sprite : {sprites}", + "swap-local-global/cant-convert-stage": "La scène ne peut pas avoir de variables uniquement pour ce sprite.", + "swap-local-global/cant-convert-to-local": "Impossible d'effectuer la conversion car plusieurs sprites l'utilisent : {sprites}", + "swap-local-global/cant-convert-used-elsewhere": "Impossible d'effectuer la conversion car un autre sprite l'utilise : {sprite}", + "swap-local-global/edit": "Modifier les propriétés", + "swap-local-global/edit-list-header": "Modifier la liste", + "swap-local-global/edit-list-option": "Renommer ou modifier la liste", + "swap-local-global/edit-variable-header": "Modifier la variable", + "swap-local-global/edit-variable-option": "Renommer ou modifier la variable", + "swap-local-global/to-global": "Convertir en \"Pour tous les sprites\"", + "swap-local-global/to-local": "Convertir en \"Pour ce sprite uniquement\"", + "hide-stage/hide-stage": "Cacher la scène" +} \ No newline at end of file diff --git a/src/addons/addons-l10n/hu.json b/src/addons/addons-l10n/hu.json new file mode 100644 index 0000000000000000000000000000000000000000..b6c9f73e121e86faa0e64071002d0c510e1facf2 --- /dev/null +++ b/src/addons/addons-l10n/hu.json @@ -0,0 +1,238 @@ +{ + "editor-devtools/clean-plus": "Rendrakás +", + "editor-devtools/copy-all": "Minden Másolása", + "editor-devtools/copy-block": "Blokk Másolása", + "editor-devtools/cut-block": "Blokk Kivágása", + "editor-devtools/lists": "listák", + "editor-devtools/make-space": "Csinálj Helyet", + "editor-devtools/orphaned": "{count, plural, one {Fejlesztői eszközök: Törölni szeretnél 1 kódon kívüli értékadó blokkot?} other {Fejlesztői eszközök: Törölni szeretnél # kódon kívüli értékadó blokkot?} }", + "editor-devtools/paste": "Beillesztés", + "editor-devtools/replace": "Fejlesztői eszközök: Lecserélsz minden {name} változót ebben a szereplőben egy másik változóra, amit úgy hívnak:", + "editor-devtools/swap": "{var} cserélye a Szereplőben", + "editor-devtools/unused-list": "{count, plural, one {Fejlesztői eszközök: Törölni szeretnél 1 nem használt helyi listát? Itt van:\n} other {Fejlesztői eszközök: Törölni szeretnél # nem használt heliy listát? Itt vannak:\n} }", + "editor-devtools/unused-var": "{count, plural, one {Fejlesztői eszközök: Törölni szeretnél 1 nem használt helyi változót? Itt van:\n} other {Fejlesztői eszközök: Törölni szeretnél # nem használt helyi változót? Itt vannak:\n} }", + "editor-devtools/var-not-exist": "Ez a változó nem létezik...", + "editor-devtools/variables": "változók", + "find-bar/complex-broadcast": "(kifejezés)", + "find-bar/find-placeholder": "Keresés (Ctrl+F)", + "middle-click-popup/start-typing": "Kezdjen el gépelni...", + "editor-searchable-dropdowns/createBroadcast": "\"{name}\" üzenet létrehozása", + "editor-searchable-dropdowns/createGlobalList": "\"{name}\" lista létrehozása minden szereplőnek", + "editor-searchable-dropdowns/createGlobalVariable": "\"{name}\" változó létrehozása minden szereplőnek", + "editor-searchable-dropdowns/createLocalList": "\"{name}\" lista létrehozása ennek a szereplőnek", + "editor-searchable-dropdowns/createLocalVariable": "\"{name}\" változó létrehozása ennek a szereplőnek", + "data-category-tweaks-v2/for-all-sprites": "Minden szereplőé:", + "data-category-tweaks-v2/for-this-sprite-only": "A kiválasztott szereplőé:", + "data-category-tweaks-v2/list-category": "Listák", + "hide-flyout/lock": "Paletta zárolása", + "hide-flyout/unlock": "Paletta zárolásának visszavonása", + "mediarecorder/cancel": "Mégsem", + "mediarecorder/click-flag": "Várakozás...", + "mediarecorder/click-flag-description": "Kattints a zöld zászlóra a felvételhez. Kattints erre a gombra, hogy leállítsd a felvételt.", + "mediarecorder/option-title": "Felvétel Opciók", + "mediarecorder/record": "Felvétel", + "mediarecorder/record-after-flag": "Ne kezdődjön el a felvétel, amíg a zöld zászlóra rá nem kattintasz", + "mediarecorder/record-audio": "Projekt hangok felvétele", + "mediarecorder/record-audio-description": "Ez nem tartalmaz Text-to-Speech-t.", + "mediarecorder/record-description": "Felveheted a színpadot WebM fájlként. Ezt elmentheted a számítógépedre miután a felvétel véget ért.\nMegjegyzés: a változó- és listamegjelenítők nem lesznek láthatóak rajta.", + "mediarecorder/record-duration": "Felvétel Időtartama (másodperc)", + "mediarecorder/record-mic": "Mikrofon hangjának felvétele", + "mediarecorder/record-until-stop": "Felvétel leállítása miután a projekt megállt", + "mediarecorder/record-until-stop-disabled": "Engedélyezned kell a(z) \"{afterFlagOption}\" ennek az opciónak a használatához.", + "mediarecorder/start": "Kezdés", + "mediarecorder/start-delay": "Kezdési késleltetés (másodperc)", + "mediarecorder/starting-in": "Kezdés {secs} másodperc múlva...", + "mediarecorder/stop": "Felvétel Leállítása", + "debugger/block-breakpoint": "töréspont", + "debugger/block-error": "hibajelentés %s-vel", + "debugger/block-log": "naplózd %s-t", + "debugger/block-warn": "figyelmeztess %s-vel", + "debugger/cannot-pause-player": "A töréspont blokk csak a szerkeztőben használható", + "debugger/clear": "Törlés", + "debugger/clone-of": "{sprite}klónja", + "debugger/close": "Bezárás", + "debugger/console": "Napló", + "debugger/debug": "Hibakeresés", + "debugger/empty-string": "(üres érték)", + "debugger/enter-format": "Adja meg az exportálási formátumot:", + "debugger/export": "Exportálás", + "debugger/export-desc": "Kattintson Shift lenyomása közben az exportálási formátum módosításához", + "debugger/icon-error": "Hiba", + "debugger/icon-warn": "Figyelmeztetés", + "debugger/log-msg-broadcasted": "A(z) „{broadcast}” üzenet elküldve.", + "debugger/log-msg-clone-cap": "Nem sikerült „{sprite}”-t lemásolni, 300 klónnál nem lehet többet készíteni.", + "debugger/log-msg-clone-created": "„{sprite}” lemásolódott.", + "debugger/log-msg-flag-clicked": "A zöld zászló le volt nyomva.", + "debugger/no-logs": "Nincs esemény feljegyezve.", + "debugger/no-threads-running": "Nincsenek éppen futó szálak.", + "debugger/step": "Továbblépés", + "debugger/step-desc": "Lefuttat egy blokkot", + "debugger/tab-logs": "Napló", + "debugger/tab-threads": "Szálak", + "debugger/thread": "Szál {id}", + "debugger/unknown-sprite": "(névtelen szereplő)", + "debugger/unpause": "Visszatérés", + "pause/pause": "Megállítás", + "clones/clones": "másolatok: {cloneCount}", + "color-picker/hex": "hex szín", + "remove-sprite-confirm/confirm": "Ki szeretnéd törölni a szereplőt?", + "block-count/blocks": "{num, plural, one {1 blokk} other {# blokk}}", + "onion-skinning/behind": "Mögé", + "onion-skinning/front": "Elé", + "onion-skinning/layering": "Rétegezés", + "onion-skinning/merge": "Összeolvasztás", + "onion-skinning/mode": "Mód", + "onion-skinning/next": "Következő jelmezek", + "onion-skinning/opacity": "Átlátszatlanság (%)", + "onion-skinning/opacityStep": "Átlátszatlanság változás (%)", + "onion-skinning/previous": "Előző jelmezek", + "onion-skinning/settings": "Onion Skinning beállítások", + "onion-skinning/tint": "Árnyalás", + "onion-skinning/toggle": "Onion Skinning bekapcsolása", + "paint-snap/boxCenter": "Kijelölés közepe", + "paint-snap/boxCorners": "Kijelölés közepei", + "paint-snap/boxEdgeMids": "Kijelölés széleinek felezőpontjai", + "paint-snap/objectCenters": "Objektumok közepei", + "paint-snap/objectCorners": "Objektumok sarkai", + "paint-snap/objectEdges": "Objektumok szélei", + "paint-snap/objectMidlines": "Objektumok középvonalai", + "paint-snap/off": "Ki", + "paint-snap/on": "Be", + "paint-snap/pageAxes": "Lap x és y tengelyei", + "paint-snap/pageCenter": "Lap közepe", + "paint-snap/pageCorners": "Lap sarkai", + "paint-snap/pageEdges": "Lap szélei", + "paint-snap/settings": "Illesztés beállításai", + "paint-snap/snapFrom": "Illesztés innen:", + "paint-snap/snapTo": "Illessztés ide:", + "paint-snap/threshold": "Illesztési távolság", + "paint-snap/toggle": "Illesztés átváltása", + "2d-color-picker/shade": "Árnyalat", + "better-img-uploads/upload": "HD feltöltés", + "variable-manager/for-all-sprites": "Változók minden szereplőnek", + "variable-manager/for-this-sprite": "Változók ennek a szereplőnek", + "variable-manager/search": "Keresés", + "variable-manager/too-big": "Kattints a nagyon hosszú érték megjelenítéséhez.", + "variable-manager/variables": "Változók", + "search-sprites/placeholder": "Szereplők keresése...", + "sprite-properties/close-properties-panel-tooltip": "Tulajdonságok panel összecsukása", + "sprite-properties/open-properties-panel-tooltip": "Tulajdonságok panel megnyitása", + "gamepad/axes-a-b": "Tengelyek {a} & {b}", + "gamepad/axis-arrows": "Nyíl-billentyűk", + "gamepad/axis-cursor": "Kurzor", + "gamepad/axis-custom": "Egyedi", + "gamepad/axis-none": "Egyik sem", + "gamepad/browser-support": "Ennek a böngészőnek és operációs rendszernek ismert hibái vannak, amik lehet, hogy megnehezítik ennek a kiegészítőnek a használatát. Próbálj ki egy másik böngészőt, ha problémákat észlelsz.", + "gamepad/button-n": "Gomb {n}", + "gamepad/clear": "Vezérlők eltávolítása", + "gamepad/config-header": "Ez a komment gamepad támogatáshoz szükséges konfigurációkat tartalmaz harmadik féltől származó eszközökhöz, vagy weboldalakhoz, mint például: https://turbowarp.org/\nNe szerkeszd kézileg!", + "gamepad/key-click": "Kattintás", + "gamepad/key-down": "Le", + "gamepad/key-left": "Balra", + "gamepad/key-none": "(semmi)", + "gamepad/key-right": "Jobbra", + "gamepad/key-space": "Szóköz", + "gamepad/key-up": "Fel", + "gamepad/keyinput-title": "Kattints, és nyomj meg egy billentyűt, vagy kattints, hogy megváltoztass egy gombot. \"Escape\" a kilépéshez. \"Backspace\" vagy \"Delete\" gombok a törléshez.", + "gamepad/no-controllers": "Nem található kontroller. Próbálj csatlakoztatni egyet, majd egy gombot megnyomni rajta.", + "gamepad/reset": "Minden vezérlő visszaállítása a projekt alapértelmezettjére", + "gamepad/settings": "Gamepad beállítások", + "gamepad/store-in-project": "Tárold ezeket a beállításokat a projektben, hogy felülírd az alapértelmezett konfigurációkat (Kísérleti segítőeszköz projekt-készítőknek)", + "folders/add-to-folder": "hozzáadás ehhez a mappához: {folder}", + "folders/closed-folder": "Mappa", + "folders/confirm-backpack-folder": "Egész mappa mentése a hátizsákba?", + "folders/create-folder": "mappa létrehozása", + "folders/name-not-allowed": "Helytelen mappa név", + "folders/name-prompt": "Mappa neve:", + "folders/name-prompt-title": "Mappa létrehozása", + "folders/open-folder": "Nyitott", + "folders/remove-folder": "mappa eltávolítása", + "folders/remove-from-folder": "eltávolítás mappából", + "folders/rename-folder": "mappa átnevezése", + "folders/rename-folder-prompt": "Mappa átnevezése erre:", + "folders/rename-folder-prompt-title": "Mappa átnevezése", + "block-switching/control_forever": "mindig", + "block-switching/control_if": "ha", + "block-switching/control_if_else": "ha... különben", + "block-switching/control_repeat_until": "ismételd eddig", + "block-switching/control_wait_until": "várj eddig", + "block-switching/data_changevariableby": "változó változzon", + "block-switching/data_hidelist": "lista tűnjön el", + "block-switching/data_hidevariable": "változó tűnjön el", + "block-switching/data_insertatlist": "illessz be elemet", + "block-switching/data_replaceitemoflist": "cseréld ki elemet", + "block-switching/data_setvariableto": "változó legyen", + "block-switching/data_showlist": "lista jelenjen meg", + "block-switching/data_showvariable": "változó jelenjen meg", + "block-switching/debugger_error": "hiba", + "block-switching/debugger_log": "naplózd", + "block-switching/debugger_warn": "figyelmeztess", + "block-switching/event_broadcast": "üzenet küldése", + "block-switching/event_broadcastandwait": "küldj üzenetet és várj", + "block-switching/looks_backdropnumbername": "háttér sorszáma vagy neve", + "block-switching/looks_changeeffectby": "effekt változzon", + "block-switching/looks_changesizeby": "méret változzon", + "block-switching/looks_costumenumbername": "jelmez sorszáma vagy neve", + "block-switching/looks_hide": "tűnj el", + "block-switching/looks_nextbackdrop": "következő háttér", + "block-switching/looks_nextcostume": "következő jelmez", + "block-switching/looks_say": "mond", + "block-switching/looks_sayforsecs": "mond másodpercig", + "block-switching/looks_seteffectto": "effekt legyen", + "block-switching/looks_setsizeto": "méret legyen", + "block-switching/looks_show": "jelenj meg", + "block-switching/looks_switchbackdropto": "háttér legyen", + "block-switching/looks_switchbackdroptoandwait": "háttér legyen és várj", + "block-switching/looks_think": "gondold", + "block-switching/looks_thinkforsecs": "gondold másodpercig", + "block-switching/motion_changexby": "x változzon", + "block-switching/motion_changeyby": "y változzon", + "block-switching/motion_setx": "x legyen", + "block-switching/motion_sety": "y legyen", + "block-switching/motion_turnleft": "fordulj balra", + "block-switching/motion_turnright": "fordulj jobbra", + "block-switching/motion_xposition": "x pozíció", + "block-switching/motion_yposition": "y pozíció", + "block-switching/music_changeTempo": "tempó változzon", + "block-switching/music_setTempo": "tempó legyen", + "block-switching/operator_and": "és", + "block-switching/operator_mod": "maradéka", + "block-switching/operator_or": "vagy", + "block-switching/pen_changePenColorParamBy": "paraméter változzon", + "block-switching/pen_changePenHueBy": "színárnyalat változzon", + "block-switching/pen_changePenShadeBy": "árnyalat változzon", + "block-switching/pen_changePenSizeBy": "méret változzon", + "block-switching/pen_penDown": "tollat le", + "block-switching/pen_penUp": "tollat fel", + "block-switching/pen_setPenColorParamTo": "paraméter legyen", + "block-switching/pen_setPenHueToNumber": "színárnyalat legyen", + "block-switching/pen_setPenShadeToNumber": "árnyalat legyen", + "block-switching/pen_setPenSizeTo": "méret legyen", + "block-switching/sensing_mousex": "egér x", + "block-switching/sensing_mousey": "egér y", + "block-switching/sound_changeeffectby": "effekt változzon", + "block-switching/sound_changevolumeby": "hangerő változzon", + "block-switching/sound_playuntildone": "játszd végig", + "block-switching/sound_seteffectto": "effekt legyen", + "block-switching/sound_setvolumeto": "hangerő legyen", + "blocks2image/error_blocks_not_added": "Blokk hozzáadása a munkaterülethez!", + "blocks2image/export_all_to_PNG": "Minden exportálása PNG-ként", + "blocks2image/export_all_to_SVG": "Minden exportálása SVG-ként", + "blocks2image/export_selected_to_PNG": "Blokk exportálása SVG-ként", + "blocks2image/export_selected_to_SVG": "Exportáld a blokkokat SVG-ként", + "move-to-top-bottom/bottom": "áthelyezés legalulra", + "move-to-top-bottom/top": "áthelyezés legfelülre", + "swap-local-global/cant-convert-cloud": "Megosztott változókat nem lehet átkonvertálni a kiválasztott szereplőévé.", + "swap-local-global/cant-convert-conflict": "Nem konvertálható, mert szembeütközne más szereplőben található változókkal: {sprites}", + "swap-local-global/cant-convert-stage": "A színpadnak nem lehetnek kiválsztott szereplői változói.", + "swap-local-global/cant-convert-to-local": "Nem lehet konvertálni, mert több szereplő is használja: {sprites}", + "swap-local-global/cant-convert-used-elsewhere": "Nem konvertálható, mert ezt a nevet már használja egy másik szereplő: {sprite}", + "swap-local-global/edit": "Tulajdonságok szerkesztése:", + "swap-local-global/edit-list-header": "Lista szerkesztése", + "swap-local-global/edit-list-option": "Lista átnevezése vagy szerkesztése", + "swap-local-global/edit-variable-header": "Változó szerkesztése", + "swap-local-global/edit-variable-option": "Változó átnevezése vagy szerkesztése", + "swap-local-global/to-global": "Konvertálás \"Minden szereplőé\"-vé", + "swap-local-global/to-local": "Konvertálás \"A kiválasztott szereplőé\"-vé", + "hide-stage/hide-stage": "Színpad elrejtése" +} \ No newline at end of file diff --git a/src/addons/addons-l10n/it.json b/src/addons/addons-l10n/it.json new file mode 100644 index 0000000000000000000000000000000000000000..5f3d34746c1ea8d369785f607d112e111b224f91 --- /dev/null +++ b/src/addons/addons-l10n/it.json @@ -0,0 +1,235 @@ +{ + "editor-devtools/clean-plus": "Riordina i Blocchi (+)", + "editor-devtools/copy-all": "Copia Tutti", + "editor-devtools/copy-block": "Copia il Blocco", + "editor-devtools/cut-block": "Taglia il Blocco", + "editor-devtools/lists": "liste", + "editor-devtools/make-space": "Fai Spazio", + "editor-devtools/orphaned": "{count, plural, one {Strumenti per sviluppatori: Rimuovere 1 blocco monitor non collegato agli script?} many {Strumenti per sviluppatori: Rimuovere # blocchi monitor non collegati agli script?} other {Strumenti per sviluppatori: Rimuovere # blocchi monitor non collegati agli script?} }", + "editor-devtools/paste": "Incolla", + "editor-devtools/replace": "Strumenti per sviluppatori: Scambia tutti le occorrenze della variabile {name} in questo sprite con la variabile:", + "editor-devtools/swap": "Scambia {var} nello Sprite", + "editor-devtools/unused-list": "{count, plural, one {Strumenti per sviluppatori: Rimuovere 1 lista locale inutilizzata? Eccola qui:\n} many {Strumenti per sviluppatori: Rimuovere # liste locali inutilizzate? Eccole qui:\n} other {Strumenti per sviluppatori: Rimuovere # liste locali inutilizzate? Eccole qui:\n} }", + "editor-devtools/unused-var": "{count, plural, one {Strumenti per sviluppatori: Rimuovere 1 variabile locale inutilizzata? Eccola qui:\n} many {Strumenti per sviluppatori: Rimuovere # variabili locali inutilizzate? Eccole qui:\n} other {Strumenti per sviluppatori: Rimuovere # variabili locali inutilizzate? Eccole qui:\n} }", + "editor-devtools/var-not-exist": "Questa variabile non esiste...", + "editor-devtools/variables": "variabili", + "find-bar/complex-broadcast": "(espressione)", + "find-bar/find-placeholder": "Cerca (Ctrl+F)", + "middle-click-popup/start-typing": "Inizia a Scrivere...", + "editor-searchable-dropdowns/createBroadcast": "Crea il messaggio \"{name}\"", + "editor-searchable-dropdowns/createGlobalList": "Crea la lista \"{name}\" per tutti gli sprite", + "editor-searchable-dropdowns/createGlobalVariable": "Crea la variabile \"{name}\" per tutti gli sprite.", + "editor-searchable-dropdowns/createLocalList": "Crea la lista \"{name}\" solo per questo sprite", + "editor-searchable-dropdowns/createLocalVariable": "Crea la variabile \"{name}\" solo per questo sprite", + "data-category-tweaks-v2/for-all-sprites": "Per tutti gli sprite:", + "data-category-tweaks-v2/for-this-sprite-only": "Solo per questo sprite:", + "data-category-tweaks-v2/list-category": "Liste", + "hide-flyout/lock": "Blocca Elenco Blocchi", + "hide-flyout/unlock": "Sblocca Elenco Blocchi", + "mediarecorder/cancel": "Annulla", + "mediarecorder/click-flag": "In attesa...", + "mediarecorder/click-flag-description": "Clicca la bandiera verde per avviare la registrazione. Clicca questo tasto per fermarla.", + "mediarecorder/option-title": "Opzioni Registrazione", + "mediarecorder/record": "Registra", + "mediarecorder/record-after-flag": "Non avviare la registrazione finché non viene cliccata la bandiera verde", + "mediarecorder/record-audio": "Includi suoni del progetto", + "mediarecorder/record-audio-description": "Questo non include l'estensione Da Testo A Voce", + "mediarecorder/record-description": "Registra lo stage come file WebM. Quando la registrazione termina puoi salvarla sul tuo computer.\nNota: i monitor delle variabili e delle liste non saranno visibili.", + "mediarecorder/record-duration": "Durata Registrazione (in secondi)", + "mediarecorder/record-mic": "Includi i suoni del microfono", + "mediarecorder/record-until-stop": "Arresta la registrazione quando il progetto viene fermato", + "mediarecorder/record-until-stop-disabled": "Devi abilitare “{afterFlagOption}” per usare questa opzione.", + "mediarecorder/start": "Avvia", + "mediarecorder/start-delay": "Ritardo Avvio (in secondi)", + "mediarecorder/starting-in": "Inizierà tra {secs}...", + "mediarecorder/stop": "Arresta Registrazione", + "debugger/block-error": "errore %s", + "debugger/block-warn": "avviso %s", + "debugger/cannot-pause-player": "Il blocco breakpoint può essere usato solo nell'editor.", + "debugger/clear": "Cancella", + "debugger/clone-of": "Clone di {sprite}", + "debugger/close": "Chiudi", + "debugger/console": "Log", + "debugger/empty-string": "(stringa vuota)", + "debugger/enter-format": "Inserisci il formato di esportazione:", + "debugger/export": "Esporta", + "debugger/export-desc": "Per personalizzare il formato di esportazione clicca tenendo premuto Shift.", + "debugger/icon-error": "Errore", + "debugger/icon-warn": "Avviso", + "debugger/log-msg-broadcasted": "Inviato '{broadcast}'.", + "debugger/log-msg-clone-cap": "Creazione del clone di '{sprite}' fallita, non è possibile creare più di 300 cloni..", + "debugger/log-msg-clone-created": "Creato clone di '{sprite}'.", + "debugger/log-msg-flag-clicked": "Bandiera verde cliccata.", + "debugger/no-logs": "Non ci sono log da mostrare.", + "debugger/no-threads-running": "Nessun thread in esecuzione.", + "debugger/step": "Passi", + "debugger/step-desc": "Esegue un blocco.", + "debugger/tab-logs": "Log", + "debugger/tab-threads": "Thread", + "debugger/unknown-sprite": "(sprite sconosciuto)", + "debugger/unpause": "Riprendi", + "pause/pause": "Pausa", + "clones/clones": "cloni: {cloneCount}", + "color-picker/hex": "colore esadecimale", + "remove-sprite-confirm/confirm": "Vuoi cancellare lo sprite?", + "block-count/blocks": "{num, plural, one {1 blocco} many {# blocchi} other {# blocchi}}", + "onion-skinning/behind": "Secondo piano", + "onion-skinning/front": "Primo piano", + "onion-skinning/layering": "Livelli", + "onion-skinning/merge": "Unisci", + "onion-skinning/mode": "Modalità", + "onion-skinning/next": "Costumi seguenti", + "onion-skinning/opacity": "Opacità (%)", + "onion-skinning/opacityStep": "Incremento opacità (%)", + "onion-skinning/previous": "Costumi precedenti", + "onion-skinning/settings": "Impostazioni Onion Skin", + "onion-skinning/tint": "Colore", + "onion-skinning/toggle": "Attiva/Disattiva Onion Skin", + "paint-snap/boxCenter": "Centro della selezione", + "paint-snap/boxCorners": "Angoli della selezione", + "paint-snap/boxEdgeMids": "Punti mediani sui bordi della selezione", + "paint-snap/objectCenters": "Centri degli oggetti", + "paint-snap/objectCorners": "Angoli degli oggetti", + "paint-snap/objectEdges": "Bordi degli oggetti", + "paint-snap/objectMidlines": "Linea mediana degli oggetti", + "paint-snap/off": "Disattivato", + "paint-snap/on": "Attivo", + "paint-snap/pageAxes": "Assi x e y della pagina", + "paint-snap/pageCenter": "Centro della pagina", + "paint-snap/pageCorners": "Angoli della pagina", + "paint-snap/pageEdges": "Bordi della pagina", + "paint-snap/settings": "Impostazioni Magnete", + "paint-snap/snapFrom": "Attiva magnete da:", + "paint-snap/snapTo": "Attacca a:", + "paint-snap/threshold": "DIstanza di attivazione del magnete", + "paint-snap/toggle": "Attiva/Disattiva Magnete", + "2d-color-picker/shade": "Ombreggiatura", + "better-img-uploads/upload": "Caricamento HD", + "variable-manager/for-all-sprites": "Variabili per tutti gli sprite", + "variable-manager/for-this-sprite": "Variabili di questo sprite", + "variable-manager/search": "Cerca", + "variable-manager/too-big": "Clicca per mostrare valori molto grandi.", + "variable-manager/variables": "Variabili", + "search-sprites/placeholder": "Cerca sprite...", + "sprite-properties/close-properties-panel-tooltip": "Nascondi il pannello delle informazioni", + "sprite-properties/open-properties-panel-tooltip": "Apri il pannello delle informazioni", + "gamepad/axes-a-b": "Assi {a} & {b}", + "gamepad/axis-arrows": "Tasti Freccia", + "gamepad/axis-cursor": "Cursore", + "gamepad/axis-custom": "Personalizzato", + "gamepad/axis-none": "Nessuno", + "gamepad/browser-support": "Questo browser e sistema operativo hanno bug noti che possono rendere questo addon difficile da usare. Prova un diverso browser se riscontri dei problemi.", + "gamepad/button-n": "Pulsante {n}", + "gamepad/clear": "Rimuovi tutti i controli", + "gamepad/config-header": "Questo commento contiene impostazioni di configurazione per il supporto di gamepad support in tool di terze parti o in siti come https://turbowarp.org/\nNon modificare a mano", + "gamepad/key-down": "Giù", + "gamepad/key-enter": "Invio", + "gamepad/key-left": "Sinistra", + "gamepad/key-none": "(nessuno)", + "gamepad/key-right": "Destra", + "gamepad/key-space": "Spazio", + "gamepad/key-up": "Su", + "gamepad/keyinput-title": "Clicca e premi un tasto o clicca per cambiare pulsante. Escape per annullare. Backspace o cancella per ripulire.", + "gamepad/no-controllers": "Nessun controller rilevato. Prova a collegarne uno e a premere un pulsante del controller.", + "gamepad/reset": "Riporta i controli a quelli predefiniti", + "gamepad/settings": "Impostazioni Gamepad", + "gamepad/store-in-project": "Memorizza queste impostazioni nel progetto per evitare le configurazioni predefinite (Tool sperimentale per i creatori di progetti)", + "folders/add-to-folder": "inserisci nella cartella: {folder}", + "folders/closed-folder": "Cartella", + "folders/confirm-backpack-folder": "Salvare l'intera cartella nella valigetta?", + "folders/create-folder": "crea cartella", + "folders/name-not-allowed": "Nome cartella non valido", + "folders/name-prompt": "Nome della cartella:", + "folders/name-prompt-title": "Crea Cartella", + "folders/open-folder": "Aperto", + "folders/remove-folder": "rimuovi cartella", + "folders/remove-from-folder": "rimuovi dalla cartella", + "folders/rename-folder": "rinomina cartella", + "folders/rename-folder-prompt": "Rinomina cartella come:", + "folders/rename-folder-prompt-title": "Rinomina Cartella", + "block-switching/control_forever": "per sempre", + "block-switching/control_if": "se allora", + "block-switching/control_if_else": "se allora... altrimenti", + "block-switching/control_repeat_until": "ripeti fino a quando", + "block-switching/control_wait_until": "attendi fino a quando", + "block-switching/data_changevariableby": "cambia variabile di", + "block-switching/data_hidelist": "nascondi la lista", + "block-switching/data_hidevariable": "nascondi la variabile", + "block-switching/data_insertatlist": "inserisci elemento alla posizione di", + "block-switching/data_replaceitemoflist": "sostituisci elemento", + "block-switching/data_setvariableto": "porta variabile a", + "block-switching/data_showlist": "mostra la lista", + "block-switching/data_showvariable": "mostra la variabile", + "block-switching/debugger_error": "errore", + "block-switching/debugger_warn": "avviso", + "block-switching/event_broadcast": "Invia a tutti", + "block-switching/event_broadcastandwait": "Invia a tutti e attendi", + "block-switching/looks_backdropnumbername": "numero o nome sfondo", + "block-switching/looks_changeeffectby": "cambia effetto di", + "block-switching/looks_changesizeby": "cambia dimensione di", + "block-switching/looks_costumenumbername": "numero o nome costume", + "block-switching/looks_hide": "nascondi", + "block-switching/looks_nextbackdrop": "passa allo sfondo seguente", + "block-switching/looks_nextcostume": "passa al costume seguente", + "block-switching/looks_say": "dire", + "block-switching/looks_sayforsecs": "dire per secondi", + "block-switching/looks_seteffectto": "porta effetto a", + "block-switching/looks_setsizeto": "porta dimensione a", + "block-switching/looks_show": "mostra", + "block-switching/looks_switchbackdropto": "passa allo sfondo", + "block-switching/looks_switchbackdroptoandwait": "passa allo sfondo e attendi", + "block-switching/looks_think": "pensa", + "block-switching/looks_thinkforsecs": "pensa per secondi", + "block-switching/motion_changexby": "cambia x di", + "block-switching/motion_changeyby": "cambia y di", + "block-switching/motion_setx": "vai dove x è", + "block-switching/motion_sety": "vai dove x è", + "block-switching/motion_turnleft": "ruota a sinistra", + "block-switching/motion_turnright": "ruota a destra", + "block-switching/motion_xposition": "posizione x", + "block-switching/motion_yposition": "posizione y", + "block-switching/music_changeTempo": "cambia tempo di", + "block-switching/music_setTempo": "imposta tempo a bpm", + "block-switching/operator_and": "e", + "block-switching/operator_mod": "resto della divisione", + "block-switching/operator_or": "o", + "block-switching/pen_changePenColorParamBy": "cambia parametro di", + "block-switching/pen_changePenHueBy": "cambia colore di", + "block-switching/pen_changePenShadeBy": "cambia ombreggiatura di", + "block-switching/pen_changePenSizeBy": "cambia dimensione di", + "block-switching/pen_penDown": "penna giù", + "block-switching/pen_penUp": "penna su", + "block-switching/pen_setPenColorParamTo": "porta parametro a", + "block-switching/pen_setPenHueToNumber": "porta colore a", + "block-switching/pen_setPenShadeToNumber": "porta ombreggiatura a", + "block-switching/pen_setPenSizeTo": "porta dimensione a", + "block-switching/sensing_mousex": "x del mouse", + "block-switching/sensing_mousey": "y del mouse", + "block-switching/sound_changeeffectby": "cambia effetto di", + "block-switching/sound_changevolumeby": "cambia volume di", + "block-switching/sound_play": "avvia", + "block-switching/sound_playuntildone": "riproduci suono e attendi la fine", + "block-switching/sound_seteffectto": "porta effetto a", + "block-switching/sound_setvolumeto": "porta volume a", + "blocks2image/error_blocks_not_added": "Aggiungi i blocchi al tuo workspace!", + "blocks2image/export_all_to_PNG": "Esporta tutto come PNG", + "blocks2image/export_all_to_SVG": "Esporta tutto come SVG", + "blocks2image/export_selected_to_PNG": "Esporta gli script come PNG", + "blocks2image/export_selected_to_SVG": "Esporta gli script come SVG", + "editor-extra-keys/enter-key": "invio", + "move-to-top-bottom/bottom": "porta in fondo", + "move-to-top-bottom/top": "porta in cima", + "swap-local-global/cant-convert-cloud": "Le variabili cloud non possono essere convertite a \"Solo per questo sprite\"", + "swap-local-global/cant-convert-conflict": "Impossibile convertire perché entrerebbe in conflitto con le variabili di un altro sprite: {sprites}", + "swap-local-global/cant-convert-stage": "Lo stage non può avere variabili \"Solo per questo sprite\".", + "swap-local-global/cant-convert-to-local": "Impossibile fare la conversione perché è usata in più sprite: {sprites}", + "swap-local-global/cant-convert-used-elsewhere": "Impossibile fare la conversione perché è usata in un altro sprite: {sprite}", + "swap-local-global/edit": "Modifica le proprietà:", + "swap-local-global/edit-list-header": "Modifica Lista", + "swap-local-global/edit-list-option": "Rinomina o modifica una lista", + "swap-local-global/edit-variable-header": "Modifica Variabile", + "swap-local-global/edit-variable-option": "Rinomina o modifica una variabile", + "swap-local-global/to-global": "Converti in \"Per tutti gli sprite\"", + "swap-local-global/to-local": "Converti in \"Solo per questo sprite\"", + "hide-stage/hide-stage": "Nascondi stage" +} \ No newline at end of file diff --git a/src/addons/addons-l10n/ja.json b/src/addons/addons-l10n/ja.json new file mode 100644 index 0000000000000000000000000000000000000000..578c1acd0d90f25f7597165bc346b4db0b2bd0a5 --- /dev/null +++ b/src/addons/addons-l10n/ja.json @@ -0,0 +1,250 @@ +{ + "editor-devtools/clean-plus": "きれいにする +", + "editor-devtools/copy-all": "すべてコピー", + "editor-devtools/copy-block": "ブロックをコピー", + "editor-devtools/cut-block": "ブロックを切り取り", + "editor-devtools/lists": "リスト", + "editor-devtools/make-space": "スペースを確保", + "editor-devtools/orphaned": "{count, plural, other {開発者ツール: 未使用の値ブロックを # 個見つけました。削除しますか?} }", + "editor-devtools/paste": "貼り付け", + "editor-devtools/replace": "開発者ツール: このスプライト内の変数{name}をすべて置き換える:", + "editor-devtools/swap": "スプライト内の{var}を一括切り替え", + "editor-devtools/unused-list": "{count, plural, other {開発者ツール: 未使用のこのスプライトのみのリストを # 個見つけました。削除しますか? 以下が一覧です:\n} }", + "editor-devtools/unused-var": "{count, plural, other {開発者ツール: 未使用のこのスプライトのみの変数を # 個見つけました。削除しますか? 以下が一覧です:\n} }", + "editor-devtools/var-not-exist": "その変数は存在しません。", + "editor-devtools/variables": "変数", + "find-bar/complex-broadcast": "(式)", + "find-bar/find-placeholder": "検索 (Ctrl+F)", + "middle-click-popup/start-typing": "入力する...", + "editor-searchable-dropdowns/createBroadcast": "メッセージ「{name}」を作成", + "editor-searchable-dropdowns/createGlobalList": "すべてのスプライト用のリスト「{name}」を作成", + "editor-searchable-dropdowns/createGlobalVariable": "すべてのスプライト用の変数「{name}」を作成", + "editor-searchable-dropdowns/createLocalList": "このスプライトのみのリスト「{name}」を作成", + "editor-searchable-dropdowns/createLocalVariable": "このスプライトのみの変数「{name}」を作成", + "data-category-tweaks-v2/for-all-sprites": "すべてのスプライト用:", + "data-category-tweaks-v2/for-this-sprite-only": "このスプライトのみ:", + "data-category-tweaks-v2/list-category": "リスト", + "hide-flyout/lock": "パレットをロック", + "hide-flyout/unlock": "パレットをロック解除", + "mediarecorder/cancel": "キャンセル", + "mediarecorder/record": "録画", + "mediarecorder/click-flag": "待機中...", + "mediarecorder/click-flag-description": "緑の旗を押して録画を開始してください。このボタンを押すと録画を中止できます。", + "mediarecorder/option-title": "録画のオプション", + "mediarecorder/record-after-flag": "緑の旗を押して録画を開始する", + "mediarecorder/record-audio": "プロジェクトを録音する", + "mediarecorder/record-audio-description": "音声合成は含まれません。", + "mediarecorder/record-description": "ステージをMP4またはWebMファイルとして録画します。録画終了後、コンピューターに保存できます。\n注: 変数モニターとリストモニターは表示されません。", + "mediarecorder/record-duration": "録画時間 (秒)", + "mediarecorder/record-mic": "マイクの音を録音する", + "mediarecorder/record-until-stop": "プロジェクトの停止後に録画も停止する", + "mediarecorder/record-until-stop-disabled": "このオプションを有効化するには、「{afterFlagOption}」を先に有効化してください。", + "mediarecorder/start": "録画開始", + "mediarecorder/start-delay": "待ち時間 (秒)", + "mediarecorder/starting-in": "{secs}秒後に開始...", + "mediarecorder/stop": "録画を停止", + "mediarecorder/record-entire-screen": "画面全体を録画する", + "mediarecorder/error-entire-screen": "画面全体を録画しようとしてエラーが発生しました", + "debugger/block-breakpoint": "ブレークポイント", + "debugger/block-error": "エラー%sを記録", + "debugger/block-log": "%sをログに記録", + "debugger/block-warn": "警告%sを記録", + "debugger/cannot-pause-player": "ブレークポイントブロックは、エディター内のみで利用できます。", + "debugger/clear": "消す", + "debugger/clone-of": "{sprite}のクローン", + "debugger/close": "閉じる", + "debugger/console": "ログ", + "debugger/debug": "デバッグ", + "debugger/empty-string": "(空文字列)", + "debugger/enter-format": "出力方式を入力:", + "debugger/export": "書き出し", + "debugger/export-desc": "Shiftキーを押しながらクリックして出力方式を指定できます。", + "debugger/icon-error": "エラー", + "debugger/icon-warn": "警告", + "debugger/log-msg-broadcasted": "メッセージ「{broadcast}」を送りました。", + "debugger/log-msg-clone-cap": "「{sprite}」のクローンに失敗しました: クローンは合計300個までしか作成できません。", + "debugger/log-msg-clone-created": "「{sprite}」をクローンしました。", + "debugger/log-msg-flag-clicked": "緑の旗が押されました。", + "debugger/no-logs": "表示する内容がありません。", + "debugger/no-threads-running": "実行中のスレッドはありません。", + "debugger/step": "次に進む", + "debugger/step-desc": "ブロックを一つずつ実行する。", + "debugger/tab-logs": "ログ", + "debugger/tab-threads": "スレッド", + "debugger/thread": "スレッド {id}", + "debugger/unknown-sprite": "(不明なスプライト)", + "debugger/unpause": "再開", + "pause/pause": "一時停止", + "clones/clones": "クローン: {cloneCount}", + "color-picker/hex": "16進数カラーコード", + "remove-sprite-confirm/confirm": "スプライトを削除したいですか?", + "block-count/blocks": "{num, plural, other {# ブロック}}", + "onion-skinning/behind": "後ろ", + "onion-skinning/front": "前", + "onion-skinning/layering": "レイヤー", + "onion-skinning/merge": "マージ", + "onion-skinning/mode": "モード", + "onion-skinning/next": "次のコスチューム", + "onion-skinning/opacity": "透明度 (%)", + "onion-skinning/opacityStep": "透明度の変化の割合 (%)", + "onion-skinning/previous": "前のコスチューム", + "onion-skinning/settings": "半透明エディターの設定", + "onion-skinning/tint": "色合い", + "onion-skinning/toggle": "半透明にする", + "paint-snap/boxCenter": "選択したオブジェクトの中央", + "paint-snap/boxCorners": "選択したオブジェクトの角", + "paint-snap/boxEdgeMids": "選択したオブジェクトの中点", + "paint-snap/objectCenters": "オブジェクトの中央", + "paint-snap/objectCorners": "オブジェクトの角", + "paint-snap/objectEdges": "オブジェクトの端", + "paint-snap/objectMidlines": "オブジェクトの中央線", + "paint-snap/off": "オフ", + "paint-snap/on": "オン", + "paint-snap/pageAxes": "ページの座標軸", + "paint-snap/pageCenter": "ページの中央", + "paint-snap/pageCorners": "ページの角", + "paint-snap/pageEdges": "ページの端", + "paint-snap/settings": "スナップ設定", + "paint-snap/snapFrom": "スナップ元:", + "paint-snap/snapTo": "スナップ先:", + "paint-snap/threshold": "スナップ距離", + "paint-snap/toggle": "スナップを有効化", + "2d-color-picker/shade": "濃さ", + "better-img-uploads/upload": "HD アップロード", + "variable-manager/for-all-sprites": "すべてのスプライト用の変数", + "variable-manager/for-this-sprite": "このスプライトの変数", + "variable-manager/search": "検索", + "variable-manager/too-big": "クリックして非常に大きな値を表示", + "variable-manager/variables": "変数", + "search-sprites/placeholder": "スプライトを検索...", + "sprite-properties/close-properties-panel-tooltip": "プロパティ―パネルを閉じる", + "sprite-properties/open-properties-panel-tooltip": "プロパティ―パネルを開く", + "gamepad/axes-a-b": "軸 {a} と {b}", + "gamepad/axis-arrows": "矢印キー", + "gamepad/axis-cursor": "カーソル", + "gamepad/axis-custom": "カスタム", + "gamepad/axis-none": "なし", + "gamepad/browser-support": "このブラウザーとOSではアドオンは正常に動作しません。他のブラウザーの利用をおすすめします。", + "gamepad/button-n": "ボタン{n}", + "gamepad/clear": "コントロールを全解除", + "gamepad/config-header": "以下のコメントには、https://turbowarp.org/ などの外部のツールやウェブサイトで利用されるゲームパッド設定が保存されています。\n編集しないこと。", + "gamepad/key-click": "クリック", + "gamepad/key-down": "下", + "gamepad/key-left": "左", + "gamepad/key-none": "(なし)", + "gamepad/key-right": "右", + "gamepad/key-space": "スペース", + "gamepad/key-up": "上", + "gamepad/keyinput-title": "キーを押してボタンが変更できます。Escキーでキャンセルできます。BackspaceまたはDeleteキーで削除できます。", + "gamepad/no-controllers": "コントローラーが接続されていません。接続して、ボタンを押してください。", + "gamepad/reset": "プロジェクトの既定にリセット", + "gamepad/settings": "ゲームパッド設定", + "gamepad/store-in-project": "プロジェクトに初期設定を保存する (プロジェクト作成者のための実験的機能)", + "folders/add-to-folder": "フォルダー {folder} に追加", + "folders/closed-folder": "フォルダー", + "folders/confirm-backpack-folder": "フォルダーをバックパックしますか?", + "folders/create-folder": "フォルダーを作成", + "folders/name-not-allowed": "フォルダー名は無効です", + "folders/name-prompt": "フォルダー名:", + "folders/name-prompt-title": "フォルダーを作成", + "folders/open-folder": "表示中", + "folders/remove-folder": "フォルダーを削除", + "folders/remove-from-folder": "フォルダーから出す", + "folders/rename-folder": "フォルダーを改名", + "folders/rename-folder-prompt": "フォルダーの改名先:", + "folders/rename-folder-prompt-title": "フォルダーを改名", + "block-switching/control_forever": "ずっと", + "block-switching/control_if": "もし", + "block-switching/control_if_else": "もし... でなければ", + "block-switching/control_repeat_until": "...回繰り返す", + "block-switching/control_wait_until": "...まで待つ", + "block-switching/data_changevariableby": "変数を...ずつ変える", + "block-switching/data_deletealloflist": "全て削除", + "block-switching/data_deleteoflist": "アイテムを削除", + "block-switching/data_hidelist": "リスト...を隠す", + "block-switching/data_hidevariable": "変数...を隠す", + "block-switching/data_insertatlist": "挿入する", + "block-switching/data_replaceitemoflist": "置き換える", + "block-switching/data_setvariableto": "変数を...にする", + "block-switching/data_showlist": "リスト...を表示する", + "block-switching/data_showvariable": "変数...を表示する", + "block-switching/debugger_error": "エラー", + "block-switching/debugger_log": "ログ", + "block-switching/debugger_warn": "警告", + "block-switching/event_broadcast": "...を送る", + "block-switching/event_broadcastandwait": "...を送って待つ", + "block-switching/looks_backdropnumbername": "背景の番号・名前", + "block-switching/looks_changeeffectby": "画像効果を...ずつ変える", + "block-switching/looks_changesizeby": "大きさを...ずつ変える", + "block-switching/looks_costumenumbername": "コスチュームの番号・名前", + "block-switching/looks_goforwardbackwardlayers": "前方または後方のレイヤーに移動する", + "block-switching/looks_gotofrontback": "前方または後方のレイヤーに移動する", + "block-switching/looks_hide": "隠す", + "block-switching/looks_nextbackdrop": "次の背景", + "block-switching/looks_nextcostume": "次のコスチューム", + "block-switching/looks_say": "~と言う", + "block-switching/looks_sayforsecs": "~と~秒言う", + "block-switching/looks_seteffectto": "画像効果を...にする", + "block-switching/looks_setsizeto": "大きさを...%にする", + "block-switching/looks_show": "表示する", + "block-switching/looks_switchbackdropto": "背景を~にする", + "block-switching/looks_switchbackdroptoandwait": "背景を~にして待つ", + "block-switching/looks_think": "~と考える", + "block-switching/looks_thinkforsecs": "~と~秒考える", + "block-switching/motion_changexby": "x座標を...ずつ変える", + "block-switching/motion_changeyby": "y座標を...ずつ変える", + "block-switching/motion_setx": "x座標を...にする", + "block-switching/motion_sety": "y座標を...にする", + "block-switching/motion_changebyxy": "x y づつ変える", + "block-switching/motion_gotoxy": "x y に行く", + "block-switching/motion_turnleft": "左回転", + "block-switching/motion_turnright": "右回転", + "block-switching/motion_xposition": "x座標", + "block-switching/motion_yposition": "y座標", + "block-switching/music_changeTempo": "テンポを~ずつ変える", + "block-switching/music_setTempo": "テンポを~にする", + "block-switching/operator_and": "かつ", + "block-switching/operator_mod": "余り", + "block-switching/operator_or": "または", + "block-switching/pen_changePenColorParamBy": "ペンの...を...ずつ変える", + "block-switching/pen_changePenHueBy": "ペンの色を...ずつ変える", + "block-switching/pen_changePenShadeBy": "ペンの濃さを...ずつ変える", + "block-switching/pen_changePenSizeBy": "ペンの太さを...ずつ変える", + "block-switching/pen_penDown": "ペンを下ろす", + "block-switching/pen_penUp": "ペンを上げる", + "block-switching/pen_setPenColorParamTo": "ペンの...を...にする", + "block-switching/pen_setPenHueToNumber": "ペンの色を...にする", + "block-switching/pen_setPenShadeToNumber": "ペンの濃さを...にする", + "block-switching/pen_setPenSizeTo": "ペンの太さを...にする", + "block-switching/sensing_coloristouchingcolor": "color が color に触れた", + "block-switching/sensing_mousex": "マウスのx座標", + "block-switching/sensing_mousey": "マウスのy座標", + "block-switching/sensing_touchingcolor": "触れている色", + "block-switching/sound_changeeffectby": "音の効果を...ずつ変える", + "block-switching/sound_changevolumeby": "音量を...ずつ変える", + "block-switching/sound_play": "...の音を鳴らす", + "block-switching/sound_playuntildone": "終わるまで...の音を鳴らす", + "block-switching/sound_seteffectto": "音の効果を...にする", + "block-switching/sound_setvolumeto": "音量を...%にする", + "blocks2image/error_blocks_not_added": "ブロックを追加してください。", + "blocks2image/export_all_to_PNG": "すべてをPNGとして出力", + "blocks2image/export_all_to_SVG": "すべてをSVGとして出力", + "blocks2image/export_selected_to_PNG": "ブロックをPNGとして出力", + "blocks2image/export_selected_to_SVG": "ブロックをSVGとして出力", + "editor-extra-keys/enter-key": "Enter", + "move-to-top-bottom/bottom": "一番下に移動", + "move-to-top-bottom/top": "一番上に移動", + "swap-local-global/cant-convert-cloud": "クラウド変数を「このスプライトのみ」に設定することはできません。", + "swap-local-global/cant-convert-conflict": "他のスプライトで名前が衝突するため変更できません: {sprites}", + "swap-local-global/cant-convert-stage": "ステージは「このスプライトのみ」変数を持つことができません。", + "swap-local-global/cant-convert-to-local": "複数のスプライトで使われているため変更できません: {sprites}", + "swap-local-global/cant-convert-used-elsewhere": "他のスプライトで使用されているため変更できません: {sprite}", + "swap-local-global/edit": "属性を編集:", + "swap-local-global/edit-list-header": "リストを編集", + "swap-local-global/edit-list-option": "リストを改名・編集", + "swap-local-global/edit-variable-header": "変数を編集", + "swap-local-global/edit-variable-option": "変数を改名・編集", + "swap-local-global/to-global": "「すべてのスプライト用」にする", + "swap-local-global/to-local": "「このスプライトのみ」にする", + "hide-stage/hide-stage": "ステージを隠す" +} \ No newline at end of file diff --git a/src/addons/addons-l10n/ko.json b/src/addons/addons-l10n/ko.json new file mode 100644 index 0000000000000000000000000000000000000000..132dc592137f02ef55ebb86b2403460f59a85149 --- /dev/null +++ b/src/addons/addons-l10n/ko.json @@ -0,0 +1,216 @@ +{ + "editor-devtools/clean-plus": "블럭 정리하기 +", + "editor-devtools/copy-all": "모두 복사하기", + "editor-devtools/copy-block": "블럭 복사하기", + "editor-devtools/cut-block": "블럭 잘라내기", + "editor-devtools/lists": "리스트", + "editor-devtools/make-space": "여백 만들기", + "editor-devtools/orphaned": "{count, plural, other {개발자 도구: #개의 사용하지 않는 리포터 블럭을 삭제하시겠습니까?} }", + "editor-devtools/paste": "붙여넣기", + "editor-devtools/replace": "개발자 도구: 다음에 나올 이름의 변수에 대해 이 스프라이트의 모든 {name}을(를) 전환합니다:", + "editor-devtools/swap": "스프라이트에서 {var} 치환하기", + "editor-devtools/unused-list": "{count, plural, other {개발자 도구: #개의 사용하지 않는 지역 리스트를 제거하시겠습니까? 사용하지 않는 지역 리스트:} }", + "editor-devtools/unused-var": "{count, plural, other {개발자 도구: #개의 사용하지 않는 지역변수를 삭제하시겠습니까?} }", + "editor-devtools/var-not-exist": "이 변수는 존재하지 않습니다.", + "editor-devtools/variables": "변수", + "find-bar/find-placeholder": "찾기 (Ctrl+F)", + "middle-click-popup/start-typing": "입력 시작...", + "editor-searchable-dropdowns/createBroadcast": "메시지 \"{name}\"을(를) 생성하기", + "editor-searchable-dropdowns/createGlobalList": "전역 리스트 \"{name}\"을(를) 생성하기", + "editor-searchable-dropdowns/createGlobalVariable": "전역변수 \"{name}\"을(를) 생성하기", + "editor-searchable-dropdowns/createLocalList": "지역 리스트 \"{name}\"을(를) 생성하기", + "editor-searchable-dropdowns/createLocalVariable": "지역변수 \"{name}\"을(를) 생성하기", + "data-category-tweaks-v2/for-all-sprites": "전역적으로 사용됨:", + "data-category-tweaks-v2/for-this-sprite-only": "지역적으로 사용됨:", + "data-category-tweaks-v2/list-category": "리스트", + "mediarecorder/cancel": "취소", + "mediarecorder/click-flag": "기다려 주세요...", + "mediarecorder/click-flag-description": "초록 깃발을 눌러 녹화를 시작합니다. 이 버튼을 눌러 종료하세요.", + "mediarecorder/option-title": "녹화 설정", + "mediarecorder/record-after-flag": "초록 깃발을 클릭할 때까지 녹화를 시작하지 않습니다.", + "mediarecorder/record-audio": "프로젝트 소리 포함", + "mediarecorder/record-audio-description": "이것은 TTS가 포함되지 않습니다.", + "mediarecorder/record-duration": "녹화 시간(초)", + "mediarecorder/record-mic": "마이크를 통한 소리 포함", + "mediarecorder/record-until-stop": "프로젝트가 멈췄을 때 녹화를 종료합니다.", + "mediarecorder/record-until-stop-disabled": "당신은 이 설정을 사용하기 위해선 \"{afterFlagOption}\"을(를) 켜야 합니다.", + "mediarecorder/start": "시작", + "mediarecorder/start-delay": "시작 딜레이 (초 단위)", + "mediarecorder/starting-in": "{secs} 후에 시작합니다... ", + "mediarecorder/stop": "녹화 종료", + "debugger/block-breakpoint": "중단점", + "debugger/block-error": "오류 %s", + "debugger/block-log": "기록 %s", + "debugger/block-warn": "경고 %s", + "debugger/cannot-pause-player": "중단점 블록은 에디터에 있을 때에만 사용 가능합니다.", + "debugger/clear": "지우기", + "debugger/clone-of": "{sprite}의 복제본", + "debugger/close": "닫기", + "debugger/console": "기록", + "debugger/debug": "디버그", + "debugger/empty-string": "(빈 문자열)", + "debugger/enter-format": "내보낼 방법을 입력하세요:", + "debugger/export": "내보내기", + "debugger/export-desc": "내보낼 방법을 개인 설정하려면 Shift키를 누른 상태로 클릭하세요.", + "debugger/icon-error": "오류", + "debugger/icon-warn": "경고", + "debugger/log-msg-broadcasted": "신호 '{broadcast}'가 발송되었습니다.", + "debugger/log-msg-clone-cap": "'{sprite}'의 복제본을 생성하는 데 실패했습니다. 300개가 넘는 복제본을 만들 수 없습니다.", + "debugger/log-msg-clone-created": "'{sprite}'의 복제본이 만들어졌습니다.", + "debugger/log-msg-flag-clicked": "녹색 깃발이 클릭되었습니다.", + "debugger/no-logs": "표시할 기록이 없습니다.", + "debugger/no-threads-running": "실행 중인 작업 없음.", + "debugger/step": "절차", + "debugger/step-desc": "한 블록을 실행합니다.", + "debugger/tab-logs": "기록", + "debugger/tab-threads": "실행 중인 작업", + "debugger/thread": "작업 {id}", + "debugger/unknown-sprite": "(알 수 없는 스프라이트)", + "debugger/unpause": "재개하기", + "pause/pause": "일시정지", + "clones/clones": "복제본 {cloneCount}개", + "color-picker/hex": "HEX 색상", + "remove-sprite-confirm/confirm": "이 스프라이트를 정말로 삭제하시겠습니까?", + "block-count/blocks": "{num, plural, other {블럭 #개}}", + "onion-skinning/behind": "뒤", + "onion-skinning/front": "앞", + "onion-skinning/layering": "레이어화", + "onion-skinning/merge": "병합", + "onion-skinning/mode": "모드", + "onion-skinning/next": "다음 모양", + "onion-skinning/opacity": "투명도 (%)", + "onion-skinning/opacityStep": "투명도 스푸마토 (%)", + "onion-skinning/previous": "전 모양", + "onion-skinning/settings": "어니언 스키닝 설정", + "onion-skinning/tint": "단색 표시", + "onion-skinning/toggle": "어니언 스키닝 켜기", + "2d-color-picker/shade": "음영", + "better-img-uploads/upload": "고해상도 사진 업로드", + "variable-manager/for-all-sprites": "전역변수", + "variable-manager/for-this-sprite": "지역변수", + "variable-manager/search": "찾기", + "variable-manager/variables": "변수", + "search-sprites/placeholder": "스프라이트 검색...", + "gamepad/axes-a-b": "축 {a}와 {b}", + "gamepad/axis-arrows": "방향키", + "gamepad/axis-cursor": "커서", + "gamepad/axis-custom": "개인 설정", + "gamepad/axis-none": "없음", + "gamepad/browser-support": "이 브라우저와 운영 체제가 가지고 있는 알려진 버그들은 애드온을 사용하기 힘들게 할 수 있습니다. 문제와 마주치는 경우 다른 브라우저를 시도해 보세요.", + "gamepad/button-n": "버튼 {n}", + "gamepad/config-header": "이 주석은 https://turbowarp.org/ 와 같은 외부 도구나 웹사이트에서도 게임패드를 지원할 수 있도록 하는 실행 정보를 담고 있습니다.\n직접 편집하지 마세요.", + "gamepad/key-click": "클릭", + "gamepad/key-down": "아래", + "gamepad/key-enter": "엔터", + "gamepad/key-left": "좌", + "gamepad/key-none": "(없음)", + "gamepad/key-right": "우", + "gamepad/key-space": "스페이스", + "gamepad/key-up": "위", + "gamepad/keyinput-title": "클릭과 키를 누르거나 바꾸기 버튼을 누르세요. Esc로 취소합니다. Backspace나 delete로 지웁니다.", + "gamepad/no-controllers": "감지된 컨트롤러가 없습니다. 하나를 꽂고 버튼을 눌러 보세요.", + "gamepad/settings": "게임패드 설정", + "gamepad/store-in-project": "이 설정을 프로젝트에 저장하여 기본 구성을 덮어씌웁니다.(프로젝트 제작자들을 위한 실험 도구)", + "folders/add-to-folder": "폴더를 {folder}에 추가하기", + "folders/closed-folder": "폴더", + "folders/confirm-backpack-folder": "전체 폴더를 저장소에 담으시겠습니까?", + "folders/create-folder": "폴더 생성", + "folders/name-not-allowed": "잘못된 폴더 이름", + "folders/name-prompt": "폴더 이름:", + "folders/name-prompt-title": "폴더 만들기", + "folders/open-folder": "열림", + "folders/remove-folder": "폴더 삭제하기", + "folders/remove-from-folder": "폴더에서 삭제하기", + "folders/rename-folder": "폴더 이름 변경하기", + "folders/rename-folder-prompt": "폴더 이름 변경:", + "folders/rename-folder-prompt-title": "폴더의 이름을 다시 정하기", + "block-switching/control_forever": "무한 반복하기", + "block-switching/control_if": "만약", + "block-switching/control_if_else": "만약... 아니라면", + "block-switching/control_repeat_until": "까지 기다리기", + "block-switching/control_wait_until": "까지 기다리기", + "block-switching/data_changevariableby": "변수 변경하기", + "block-switching/data_hidelist": "리스트 숨기기", + "block-switching/data_hidevariable": "변수 숨기기", + "block-switching/data_insertatlist": "항목 넣기", + "block-switching/data_replaceitemoflist": "항목 바꾸기", + "block-switching/data_setvariableto": "변수 설정하기", + "block-switching/data_showlist": "리스트 보이기", + "block-switching/data_showvariable": "변수 보이기", + "block-switching/debugger_error": "오류", + "block-switching/debugger_log": "기록", + "block-switching/debugger_warn": "경고", + "block-switching/event_broadcast": "신호 보내기", + "block-switching/event_broadcastandwait": "신호 보내고 기다리기", + "block-switching/looks_backdropnumbername": "무대 번호 또는 이름", + "block-switching/looks_changeeffectby": "효과 바꾸기", + "block-switching/looks_changesizeby": "크기 변경하기", + "block-switching/looks_costumenumbername": "모양 번호나 이름", + "block-switching/looks_hide": "숨기기", + "block-switching/looks_nextbackdrop": "다음 배경", + "block-switching/looks_nextcostume": "다음 모양", + "block-switching/looks_say": "말하기", + "block-switching/looks_sayforsecs": "초 동안 말하기", + "block-switching/looks_seteffectto": "효과 설정하기", + "block-switching/looks_setsizeto": "크기 설정하기", + "block-switching/looks_show": "보이기", + "block-switching/looks_switchbackdropto": "배경 바꾸기", + "block-switching/looks_switchbackdroptoandwait": "배경 바꾸고 기다리기", + "block-switching/looks_think": "생각하기", + "block-switching/looks_thinkforsecs": "초 동안 생각하기", + "block-switching/motion_changexby": "x좌표 바꾸기", + "block-switching/motion_changeyby": "y좌표 바꾸기", + "block-switching/motion_setx": "x좌표 설정하기", + "block-switching/motion_sety": "y좌표 설정하기", + "block-switching/motion_turnleft": "왼쪽으로 회전하기", + "block-switching/motion_turnright": "오른쪽으로 회전하기", + "block-switching/motion_xposition": "x좌표", + "block-switching/motion_yposition": "y좌표", + "block-switching/music_changeTempo": "빠르기 변경하기", + "block-switching/music_setTempo": "빠르기 설정하기", + "block-switching/operator_and": "그리고", + "block-switching/operator_mod": "나머지", + "block-switching/operator_or": "또는", + "block-switching/pen_changePenColorParamBy": "파라미터 변경하기", + "block-switching/pen_changePenHueBy": "색상 바꾸기", + "block-switching/pen_changePenShadeBy": "색상 바꾸기", + "block-switching/pen_changePenSizeBy": "크기 바꾸기", + "block-switching/pen_penDown": "펜 내리기", + "block-switching/pen_penUp": "펜 올리기", + "block-switching/pen_setPenColorParamTo": "파라미터 설정하기", + "block-switching/pen_setPenHueToNumber": "색상 설정하기", + "block-switching/pen_setPenShadeToNumber": "색상 설정하기", + "block-switching/pen_setPenSizeTo": "크기 설정하기", + "block-switching/sensing_mousex": "마우스 x좌표", + "block-switching/sensing_mousey": "마우스 y좌표", + "block-switching/sound_changeeffectby": "효과 바꾸기", + "block-switching/sound_changevolumeby": "음량 바꾸기", + "block-switching/sound_play": "시작", + "block-switching/sound_playuntildone": "끝날 때까지 플레이하기", + "block-switching/sound_seteffectto": "효과 설정하기", + "block-switching/sound_setvolumeto": "음량 설정하기", + "blocks2image/error_blocks_not_added": "작업 공간에 블록을 추가합니다!", + "blocks2image/export_all_to_PNG": "모두 PNG로 내보내기", + "blocks2image/export_all_to_SVG": "모두 SVG로 내보내기", + "blocks2image/export_selected_to_PNG": "PNG로 블록 내보내기", + "blocks2image/export_selected_to_SVG": "SVG로 내보내기", + "editor-extra-keys/enter-key": "엔터", + "move-to-top-bottom/bottom": "맨 아래로 옮기기", + "move-to-top-bottom/top": "맨 위로 옮기기", + "rename-broadcasts/RENAME_BROADCAST": "메시지 이름 변경하기", + "rename-broadcasts/RENAME_BROADCAST_MODAL_TITLE": "메시지 이름 변경하기", + "rename-broadcasts/RENAME_BROADCAST_TITLE": "모든 \"{name}\" 메시지를 다음으로 변경:", + "swap-local-global/cant-convert-cloud": "클라우드 변수는 '이 스프라이트에서만 사용'으로 변경할 수 없습니다.", + "swap-local-global/cant-convert-conflict": "다른 스프라이트 {sprites}의 변수와 충돌하기 때문에 변환할 수 없습니다.", + "swap-local-global/cant-convert-stage": "무대는 '모든 스프라이트에서 사용'만 사용할 수 있습니다.", + "swap-local-global/cant-convert-to-local": "여러 스프라이트({sprites})에서 사용되었기 때문에 변환할 수 없습니다.", + "swap-local-global/cant-convert-used-elsewhere": "다른 스프라이트 {sprite}에 사용되었기 때문에 변환할 수 없습니다.", + "swap-local-global/edit": "속성 편집:", + "swap-local-global/edit-list-header": "리스트 편집하기", + "swap-local-global/edit-list-option": "이름을 변경하거나 리스트를 편집하기", + "swap-local-global/edit-variable-header": "변수 편집하기", + "swap-local-global/edit-variable-option": "이름을 변경하거나 리스트를 편집하기", + "swap-local-global/to-global": "\"모든 스프라이트에서 사용\"으로 바꾸기", + "swap-local-global/to-local": "\"이 스프라이트에서만 사용\"으로 바꾸기", + "hide-stage/hide-stage": "무대 숨기기" +} \ No newline at end of file diff --git a/src/addons/addons-l10n/nl.json b/src/addons/addons-l10n/nl.json new file mode 100644 index 0000000000000000000000000000000000000000..1a69ef4de3dc3e6a939a9defed70a5c38a6e5264 --- /dev/null +++ b/src/addons/addons-l10n/nl.json @@ -0,0 +1,229 @@ +{ + "editor-devtools/clean-plus": "Blokken Opruimen +", + "editor-devtools/copy-all": "Alles Kopiëren", + "editor-devtools/copy-block": "Blok Kopiëren", + "editor-devtools/cut-block": "Blok Knippen", + "editor-devtools/lists": "lijsten", + "editor-devtools/make-space": "Ruimte Maken", + "editor-devtools/orphaned": "{count, plural, one {Ontwikkelaarstools: 1 los meldingsblok verwijderen?} other {Ontwikkelaarstools: # losse meldingsblokken verwijderen?} }", + "editor-devtools/paste": "Plakken", + "editor-devtools/replace": "Ontwikkelaarstools: Alle {name} in deze sprite wisselen voor de variabele genaamd:", + "editor-devtools/swap": "Wissel {var} in Sprite", + "editor-devtools/unused-list": "{count, plural, one {Ontwikkelaarstools: 1 ongebruikte lokale lijst verwijderen? Hier is het:\n} other {Ontwikkelaarstools: # ongebruikte lokale lijsten verwijderen? Hier zijn ze:\n} }", + "editor-devtools/unused-var": "{count, plural, one {Ontwikkelaarstools: 1 ongebruikte lokale variabele verwijderen? Hier is het:\n} other {Ontwikkelaarstools: # ongebruikte lokale variabelen verwijderen? Hier zijn ze:\n} }", + "editor-devtools/var-not-exist": "Die variabele bestaat niet...", + "editor-devtools/variables": "variabelen", + "find-bar/complex-broadcast": "(expressie)", + "find-bar/find-placeholder": "Zoeken (Ctrl+F)", + "middle-click-popup/start-typing": "Begin met Typen...", + "editor-searchable-dropdowns/createBroadcast": "Bericht \"{name}\" maken", + "editor-searchable-dropdowns/createGlobalList": "Lijst \"{name}\" maken voor alle sprites", + "editor-searchable-dropdowns/createGlobalVariable": "Variabele \"{name}\" maken voor alle sprites", + "editor-searchable-dropdowns/createLocalList": "Lijst \"{name}\" maken voor alleen deze sprite", + "editor-searchable-dropdowns/createLocalVariable": "Variabele \"{name}\" maken voor alleen deze sprite", + "data-category-tweaks-v2/for-all-sprites": "Voor alle sprites:", + "data-category-tweaks-v2/for-this-sprite-only": "Alleen voor deze sprite:", + "data-category-tweaks-v2/list-category": "Lijsten", + "hide-flyout/lock": "Palet Vergrendelen", + "hide-flyout/unlock": "Palet Ontgrendelen", + "mediarecorder/cancel": "Annuleren", + "mediarecorder/click-flag": "Wachten...", + "mediarecorder/click-flag-description": "Klik op de groene vlag om te starten met opnemen. Klik op deze knop om te stoppen.", + "mediarecorder/option-title": "Opneemopties", + "mediarecorder/record": "Opnemen", + "mediarecorder/record-after-flag": "Begin niet met opnemen tot de Groene Vlag is geklikt", + "mediarecorder/record-audio": "Projectgeluiden opnemen", + "mediarecorder/record-audio-description": "Dit neemt Tekst-naar-Spraak niet op.", + "mediarecorder/record-description": "Neem het speelveld op als een WebM-bestand. Je kunt het opslaan op je computer nadat de opname klaar is.\nOpmerking: monitoren van variabelen en lijsten zijn niet zichtbaar.", + "mediarecorder/record-duration": "Opnamelengte (in seconden)", + "mediarecorder/record-mic": "Microfoon opnemen", + "mediarecorder/record-until-stop": "Stop met opnemen nadat het project is gestopt", + "mediarecorder/record-until-stop-disabled": "Je moet \"{afterFlagOption}\" aanzetten om deze optie te gebruiken.", + "mediarecorder/start-delay": "Startvertraging (in seconden)", + "mediarecorder/starting-in": "Start in {secs}…", + "mediarecorder/stop": "Opname Stoppen", + "debugger/block-breakpoint": "onderbreking", + "debugger/block-warn": "waarschuw %s", + "debugger/cannot-pause-player": "Onderbrekingsblokken kunnen alleen gebruikt worden in de editor.", + "debugger/clear": "Wissen", + "debugger/clone-of": "Kloon van {sprite}", + "debugger/close": "Sluiten", + "debugger/empty-string": "(lege string)", + "debugger/enter-format": "Voer exporteerformaat in:", + "debugger/export": "Exporteren", + "debugger/export-desc": "Shift + klik om exporteerformaat aan te passen.", + "debugger/icon-warn": "Waarschuwing", + "debugger/log-msg-broadcasted": "'{broadcast}' verzonden.", + "debugger/log-msg-clone-cap": "Kon geen kloon maken van '{sprite}', kan niet meer dan 300 klonen maken.", + "debugger/log-msg-clone-created": "Kloon gemaakt van '{sprite}'.", + "debugger/log-msg-flag-clicked": "Groene vlag geklikt.", + "debugger/no-logs": "Er zijn geen logs om weer te geven.", + "debugger/no-threads-running": "Geen threads aan de gang.", + "debugger/step": "Stap", + "debugger/step-desc": "Voert één blok uit.", + "debugger/unknown-sprite": "(onbekende sprite)", + "debugger/unpause": "Hervatten", + "pause/pause": "Pauzeren", + "clones/clones": "klonen: {cloneCount}", + "color-picker/hex": "hex-kleur", + "remove-sprite-confirm/confirm": "Wil je de sprite verwijderen?", + "block-count/blocks": "{num, plural, one {1 blok} other {# blokken}}", + "onion-skinning/behind": "Achter", + "onion-skinning/front": "Voor", + "onion-skinning/layering": "Lagen", + "onion-skinning/merge": "Samenvoegen", + "onion-skinning/mode": "Modus", + "onion-skinning/next": "Volgende uiterlijken", + "onion-skinning/opacity": "Doorzichtigheid (%)", + "onion-skinning/opacityStep": "Doorzichtigheidsstap (%)", + "onion-skinning/previous": "Vorige uiterlijken", + "onion-skinning/settings": "\"Onion Skinning\"-Instellingen", + "onion-skinning/toggle": "\"Onion Skinning\" aanzetten", + "paint-snap/boxCenter": "Middelpunt selectie", + "paint-snap/boxCorners": "Hoeken selectie", + "paint-snap/boxEdgeMids": "Middelpunten op randen selectie", + "paint-snap/objectCenters": "Objectmiddelpunt", + "paint-snap/objectCorners": "Objecthoeken", + "paint-snap/objectEdges": "Objectranden", + "paint-snap/objectMidlines": "Objectmiddenlijn", + "paint-snap/off": "Uit", + "paint-snap/on": "Aan", + "paint-snap/pageAxes": "X- en Y-assen van pagina", + "paint-snap/pageCenter": "Paginamiddelpunt", + "paint-snap/pageCorners": "Paginahoeken", + "paint-snap/pageEdges": "Paginaranden", + "paint-snap/settings": "Instellingen voor Uitlijnen", + "paint-snap/snapFrom": "Uitlijnen vanaf:", + "paint-snap/snapTo": "Uitlijnen op:", + "paint-snap/threshold": "Uitlijnafstand", + "paint-snap/toggle": "Uitlijnen Inschakelen", + "2d-color-picker/shade": "Tint", + "better-img-uploads/upload": "HD-Upload", + "variable-manager/for-all-sprites": "Variabelen voor alle sprites", + "variable-manager/for-this-sprite": "Variabelen voor deze sprite", + "variable-manager/search": "Zoeken", + "variable-manager/too-big": "Klik om grote waarde weer te geven.", + "variable-manager/variables": "Variabelen", + "search-sprites/placeholder": "Sprites zoeken...", + "sprite-properties/close-properties-panel-tooltip": "Eigenschappenpaneel samenvouwen", + "sprite-properties/open-properties-panel-tooltip": "Eigenschappenpaneel openvouwen", + "gamepad/axes-a-b": "Assen {a} & {b}", + "gamepad/axis-arrows": "Pijltjestoetsen", + "gamepad/axis-cursor": "Muisaanwijzer", + "gamepad/axis-custom": "Aangepast", + "gamepad/axis-none": "Geen", + "gamepad/browser-support": "Deze browser en besturingssysteem hebben bekende bugs die deze addon mogelijk lastig maken om te gebruiken. Probeer een andere browser als je problemen ervaart.", + "gamepad/button-n": "Knop {n}", + "gamepad/clear": "Alle besturingen verwijderen", + "gamepad/config-header": "Deze opmerking bevat configuratie voor gamepad-ondersteuning in derde-partij hulpmiddelen of websites zoals https://turbowarp.org/\nNiet met de hand bewerken", + "gamepad/key-click": "Klik", + "gamepad/key-down": "Omlaag", + "gamepad/key-left": "Links", + "gamepad/key-none": "(geen)", + "gamepad/key-right": "Rechts", + "gamepad/key-space": "Spatie", + "gamepad/key-up": "Omhoog", + "gamepad/keyinput-title": "Klik en druk een toets in of klik om knop te veranderen. Escape om te annuleren. Backspace of delete om te wissen.", + "gamepad/no-controllers": "Geen controllers gevonden. Probeer er een in te pluggen en druk een knop in.", + "gamepad/reset": "Alle besturingen resetten naar standaard van project", + "gamepad/settings": "Gamepadinstellingen", + "gamepad/store-in-project": "Sla deze instellingen op in het project om de standaardconfiguratie te overschrijven (Experimentele hulpmiddel voor projectmakers)", + "folders/add-to-folder": "voeg toe aan map: {folder}", + "folders/closed-folder": "Map", + "folders/confirm-backpack-folder": "Hele map in rugzak opslaan?", + "folders/create-folder": "map aanmaken", + "folders/name-not-allowed": "Ongeldige mapnaam", + "folders/name-prompt": "Naam van map:", + "folders/name-prompt-title": "Map Aanmaken", + "folders/open-folder": "Geopend", + "folders/remove-folder": "map verwijderen", + "folders/remove-from-folder": "verwijder uit map", + "folders/rename-folder": "map hernoemen", + "folders/rename-folder-prompt": "Hernoem map naar:", + "folders/rename-folder-prompt-title": "Map Hernoemen", + "block-switching/control_forever": "herhaal", + "block-switching/control_if": "als", + "block-switching/control_if_else": "als... anders", + "block-switching/control_repeat_until": "herhaal tot", + "block-switching/control_wait_until": "wacht tot", + "block-switching/data_changevariableby": "verander variabele", + "block-switching/data_hidelist": "verberg lijst", + "block-switching/data_hidevariable": "verberg variabele", + "block-switching/data_insertatlist": "voeg item toe", + "block-switching/data_replaceitemoflist": "vervang item", + "block-switching/data_setvariableto": "maak variabele", + "block-switching/data_showlist": "toon lijst", + "block-switching/data_showvariable": "toon variabele", + "block-switching/debugger_warn": "waarschuw", + "block-switching/event_broadcast": "zend signaal", + "block-switching/event_broadcastandwait": "zend signaal en wacht", + "block-switching/looks_backdropnumbername": "achtergrondnummer of -naam", + "block-switching/looks_changeeffectby": "verander effect", + "block-switching/looks_changesizeby": "verander grootte", + "block-switching/looks_costumenumbername": "uiterlijknummer of -naam", + "block-switching/looks_hide": "verdwijn", + "block-switching/looks_nextbackdrop": "volgende achtergrond", + "block-switching/looks_nextcostume": "volgend uiterlijk", + "block-switching/looks_say": "zeg", + "block-switching/looks_sayforsecs": "zeg voor sec.", + "block-switching/looks_seteffectto": "maak effect", + "block-switching/looks_setsizeto": "maak grootte", + "block-switching/looks_show": "verschijn", + "block-switching/looks_switchbackdropto": "verander achtergrond", + "block-switching/looks_switchbackdroptoandwait": "verander achtergrond en wacht", + "block-switching/looks_think": "denk", + "block-switching/looks_thinkforsecs": "denk voor sec.", + "block-switching/motion_changexby": "verander x", + "block-switching/motion_changeyby": "verander y", + "block-switching/motion_setx": "maak x", + "block-switching/motion_sety": "maak y", + "block-switching/motion_turnleft": "draai links", + "block-switching/motion_turnright": "draai rechts", + "block-switching/motion_xposition": "x-positie", + "block-switching/motion_yposition": "y-positie", + "block-switching/music_changeTempo": "verander tempo", + "block-switching/music_setTempo": "maak tempo", + "block-switching/operator_and": "en", + "block-switching/operator_mod": "modulo", + "block-switching/operator_or": "of", + "block-switching/pen_changePenColorParamBy": "verander penkleur", + "block-switching/pen_changePenHueBy": "verander kleur", + "block-switching/pen_changePenShadeBy": "verander helderheid", + "block-switching/pen_changePenSizeBy": "verander grootte", + "block-switching/pen_penDown": "pen neer", + "block-switching/pen_penUp": "pen op", + "block-switching/pen_setPenColorParamTo": "maak penkleur", + "block-switching/pen_setPenHueToNumber": "maak kleur", + "block-switching/pen_setPenShadeToNumber": "maak helderheid", + "block-switching/pen_setPenSizeTo": "maak grootte", + "block-switching/sensing_mousex": "muis x", + "block-switching/sensing_mousey": "muis y", + "block-switching/sound_changeeffectby": "verander effect", + "block-switching/sound_changevolumeby": "verander volume", + "block-switching/sound_playuntildone": "start en wacht", + "block-switching/sound_seteffectto": "maak effect", + "block-switching/sound_setvolumeto": "zet volume", + "blocks2image/error_blocks_not_added": "Voeg blokken toe aan werkplek!", + "blocks2image/export_all_to_PNG": "Alles exporteren als PNG", + "blocks2image/export_all_to_SVG": "Alles exporteren als SVG", + "blocks2image/export_selected_to_PNG": "Blok exporteren als PNG", + "blocks2image/export_selected_to_SVG": "Blok exporteren als SVG", + "move-to-top-bottom/bottom": "naar beneden", + "move-to-top-bottom/top": "naar boven", + "rename-broadcasts/RENAME_BROADCAST": "Signaal hernoemen", + "rename-broadcasts/RENAME_BROADCAST_MODAL_TITLE": "Signaal Hernoemen", + "rename-broadcasts/RENAME_BROADCAST_TITLE": "Alle \"{name}\"-signalen hernoemen naar:", + "swap-local-global/cant-convert-cloud": "Cloudvariabelen kunnen niet alleen voor deze sprite zijn.", + "swap-local-global/cant-convert-conflict": "Kan niet veranderen omdat variabelen in andere sprites dezelfde naam hebben: {sprites}", + "swap-local-global/cant-convert-stage": "Het speelveld kan geen variabelen voor alleen deze sprite hebben.", + "swap-local-global/cant-convert-to-local": "Kan niet veranderen omdat het wordt gebruikt door meerdere sprites: {sprites}", + "swap-local-global/cant-convert-used-elsewhere": "Kan niet veranderen omdat het wordt gebruikt door een andere sprite: {sprite}", + "swap-local-global/edit": "Eigenschappen bewerken:", + "swap-local-global/edit-list-header": "Lijst Bewerken", + "swap-local-global/edit-list-option": "Lijst hernoemen of bewerken", + "swap-local-global/edit-variable-header": "Variabele Bewerken", + "swap-local-global/edit-variable-option": "Variabele hernoemen of bewerken", + "swap-local-global/to-global": "Veranderen naar \"Voor alle sprites\"", + "swap-local-global/to-local": "Veranderen naar \"Alleen voor deze sprite\"", + "hide-stage/hide-stage": "Speelveld verbergen" +} \ No newline at end of file diff --git a/src/addons/addons-l10n/pl.json b/src/addons/addons-l10n/pl.json new file mode 100644 index 0000000000000000000000000000000000000000..69e5f3021ac08a1aea7f49efe2ae468b042ad44c --- /dev/null +++ b/src/addons/addons-l10n/pl.json @@ -0,0 +1,236 @@ +{ + "editor-devtools/clean-plus": "Wyczyść bloki +", + "editor-devtools/copy-all": "Kopiuj wszystko", + "editor-devtools/copy-block": "Kopiuj Blok", + "editor-devtools/cut-block": "Wytnij Blok", + "editor-devtools/lists": "listy", + "editor-devtools/make-space": "Zrób miejsce", + "editor-devtools/orphaned": "{count, plural, one {Narzędzia Developerskie: Usunąć 1 odłączony blok?} few {Narzędzia Developerskie: Usunąć # odłączonych bloków?} many {Narzędzia Developerskie: Usunąć # odłączonych bloków?} other {Narzędzia Developerskie: Usunąć # odłączonych bloków?} }", + "editor-devtools/paste": "Wklej", + "editor-devtools/replace": "Narzędzia Developerskie: Zmień nazwy wszystkie zmiennych {name} w tym duszku na:", + "editor-devtools/swap": "Zamień {var} w Duszku", + "editor-devtools/unused-list": "{count, plural, one {Narzędzia Developerskie: Usunąć 1 nieużywaną listę o nazwie:\n} few {Narzędzia Developerskie: Usunąć # nieużywanych list? Oto one: \n} many {Narzędzia Developerskie: Usunąć # nieużywanych list? Oto one: \n} other {Narzędzia Developerskie: Usunąć # nieużywanych list? Oto one: \n} }", + "editor-devtools/unused-var": "{count, plural, one {Narzędzia Developerskie: Usunąć 1 nieużywaną zmienną o nazwie: \n} few {Narzędzia Developerskie: Usunąć # nieużywanych zmiennych? Oto one: \n} many {Narzędzia Developerskie: Usunąć # nieużywanych zmiennych? Oto one: \n} other {Narzędzia Developerskie: Usunąć # nieużywanych zmiennych? Oto one: \n} }", + "editor-devtools/var-not-exist": "Ta zmienna nie istnieje...", + "editor-devtools/variables": "zmienne", + "find-bar/complex-broadcast": "(działanie)", + "find-bar/find-placeholder": "Szukaj (Ctr+F)", + "middle-click-popup/start-typing": "Zacznij pisać...", + "editor-searchable-dropdowns/createBroadcast": "Stwórz wiadomość \"{name}\"", + "editor-searchable-dropdowns/createGlobalList": "Utwórz listę \"{name}\" dla wszystkich duszków", + "editor-searchable-dropdowns/createGlobalVariable": "Utwórz zmienną \"{name}\" dla wszystkich duszków", + "editor-searchable-dropdowns/createLocalList": "Utwórz listę \"{name}\" tylko dla tego duszka", + "editor-searchable-dropdowns/createLocalVariable": "Utwórz zmienną \"{name}\" tylko dla tego duszka", + "data-category-tweaks-v2/for-all-sprites": "Dla wszystkich duszków:", + "data-category-tweaks-v2/for-this-sprite-only": "Tylko dla tego duszka:", + "data-category-tweaks-v2/list-category": "Listy", + "hide-flyout/lock": "Zablokuj paletę bloków", + "hide-flyout/unlock": "Odblokuj paletę bloków", + "mediarecorder/cancel": "Anuluj", + "mediarecorder/click-flag": "Czekanie...", + "mediarecorder/click-flag-description": "Kliknij zieloną flagę by zacząć nagrywanie. Kliknij ten przycisk by zatrzymać nagranie.", + "mediarecorder/option-title": "Opcje nagrywania", + "mediarecorder/record-after-flag": "Nie włączaj nagrywania dopóki zielona flaga nie jest kliknięta", + "mediarecorder/record-audio": "Uwzględnij dźwięki projektu", + "mediarecorder/record-audio-description": "Nie dotyczy to zamiany tekstu na mowę.", + "mediarecorder/record-duration": "Długość nagrywania (w sekundach)", + "mediarecorder/record-mic": "Uwzględnij dźwięki z mikrofonu", + "mediarecorder/record-until-stop": "Zatrzymaj nagrywanie gdy projekt się zatrzymał", + "mediarecorder/record-until-stop-disabled": "Aby korzystać z tej opcji, musisz włączyć opcję \"{afterFlagOption}\".", + "mediarecorder/start-delay": "Opóźnienie Startu (w sekundach)", + "mediarecorder/starting-in": "Rozpoczęcie w {secs}...", + "mediarecorder/stop": "Przestań Nagrywać", + "debugger/block-breakpoint": "punkt przerwania ", + "debugger/block-error": "zgłoś błąd %s", + "debugger/block-log": "loguj %s", + "debugger/block-warn": "ostrzeż %s", + "debugger/cannot-pause-player": "Blok \"punktu przerwania\" można używać tylko w edytorze. ", + "debugger/clear": "Wyczyść", + "debugger/clone-of": "Klon duszka {sprite}", + "debugger/close": "Zamknij", + "debugger/console": "Logi", + "debugger/debug": "Debuguj", + "debugger/empty-string": "(puste pole tekstowe)", + "debugger/enter-format": "Podaj format eksportowanego pliku:", + "debugger/export": "Eksportuj", + "debugger/export-desc": "Kliknij prawym klawiszem trzymając Shift, aby zmienić typ wyeksportowanego pliku.", + "debugger/icon-error": "Błąd", + "debugger/icon-warn": "Ostrzeżenie", + "debugger/log-msg-broadcasted": "Ogłoszono '{broadcast}'", + "debugger/log-msg-clone-cap": "Nie udało się stworzyć klona z duszka '{sprite}', ponieważ osiągnął limit 300 klonów.", + "debugger/log-msg-clone-created": "Stworzono klona z duszka '{sprite}'", + "debugger/log-msg-flag-clicked": "Zielona Flaga została naciśnięta.", + "debugger/no-logs": "Na razie nie ma żadnych informacji do wyświetlenia.", + "debugger/no-threads-running": "Żadne wątki nie działają.", + "debugger/step": "Krok", + "debugger/step-desc": "Wywołuje jeden blok.", + "debugger/tab-logs": "Logi", + "debugger/tab-threads": "Wątki", + "debugger/thread": "Wątek {id}", + "debugger/unknown-sprite": "(nieznany duszek)", + "debugger/unpause": "Wznów", + "pause/pause": "Pauza", + "clones/clones": "klony:{cloneCount}", + "color-picker/hex": "hex kolor", + "remove-sprite-confirm/confirm": "Czy chcesz usunąć duszka?", + "block-count/blocks": "{num, plural, one {1 blok} few {# bloki} many {# bloków} other {# bloków}}", + "onion-skinning/behind": "Tył", + "onion-skinning/front": "Przód", + "onion-skinning/layering": "Warstwowanie", + "onion-skinning/merge": "Łącz", + "onion-skinning/mode": "Tryb", + "onion-skinning/next": "Następne kostiumy", + "onion-skinning/opacity": "Nieprzezroczystość (%)", + "onion-skinning/opacityStep": "Nieprzezroczystość kroku (%)", + "onion-skinning/previous": "Poprzednie kostiumy", + "onion-skinning/settings": "Ustawienia Onion Skinning", + "onion-skinning/tint": "Odcień", + "onion-skinning/toggle": "Przełącz Warstwy Cebuli", + "paint-snap/boxCenter": "Środka zaznaczonego obiektu", + "paint-snap/boxCorners": "Rogów zaznaczonego obiektu", + "paint-snap/boxEdgeMids": "Lini środkowych zaznaczonego obiektu", + "paint-snap/objectCenters": "Środku obiektów", + "paint-snap/objectCorners": "Rogów obiektów", + "paint-snap/objectEdges": "Boków obiektów", + "paint-snap/objectMidlines": "Lini środkowych obiektów", + "paint-snap/off": "Wyłącz", + "paint-snap/on": "Włącz", + "paint-snap/pageAxes": "Osi X i Y", + "paint-snap/pageCenter": "Środka strony", + "paint-snap/pageCorners": "Rogów strony", + "paint-snap/pageEdges": "Boków strony", + "paint-snap/settings": "Ustawienia Przyczepiania", + "paint-snap/snapFrom": "Przyczep od:", + "paint-snap/snapTo": "Przyczep do:", + "paint-snap/threshold": "Dystans przyczepiania", + "paint-snap/toggle": "Włącz Przyczepianie", + "2d-color-picker/shade": "Cień", + "better-img-uploads/upload": "Przesyłanie HD", + "variable-manager/for-all-sprites": "Zmienne dla wszystkich duszków", + "variable-manager/for-this-sprite": "Zmienne dla tego duszka", + "variable-manager/search": "Szukaj", + "variable-manager/too-big": "Kliknij, aby wyświetlić bardzo dużą wartość.", + "variable-manager/variables": "Zmienne", + "search-sprites/placeholder": "Szukaj duszków...", + "sprite-properties/open-properties-panel-tooltip": "Otwórz panel właściwości", + "gamepad/axes-a-b": "Osie {a} i {b}", + "gamepad/axis-arrows": "Przyciski Strzałek", + "gamepad/axis-cursor": "Kursor", + "gamepad/axis-custom": "Niestandardowy", + "gamepad/axis-none": "Nic", + "gamepad/browser-support": "Ta przeglądarka i system operacyjny zawierają znane błędy, które mogą utrudniać korzystanie z tego dodatku. Wypróbuj inną przeglądarkę, jeśli napotkasz problemy. ", + "gamepad/button-n": "Przycisk {n}", + "gamepad/clear": "Wyczyść wszystkie ustawione przyciski", + "gamepad/config-header": "Ten komentarz zawiera konfigurację dla obsług pada do gier w programach jak https://turbowarp.org/\nNie edytuj ręcznie!", + "gamepad/key-click": "Kliknięcie", + "gamepad/key-down": "Dół", + "gamepad/key-left": "Lewo", + "gamepad/key-none": "(nic)", + "gamepad/key-right": "Prawo", + "gamepad/key-space": "Spacja", + "gamepad/key-up": "Góra", + "gamepad/keyinput-title": "Naciśnij i kliknij klawisz, aby zmienić przycisk. Kliknij escape, aby anulować. Aby wyczyścić naciśnij Backspace lub Cancel.", + "gamepad/no-controllers": "Nie wykryto żadnego kontrolera. Spróbuj podłączyć jeden z nich i nacisnąć przycisk na nim.", + "gamepad/reset": "Resetuj wszystkie przyciski do ustawień fabrycznych", + "gamepad/settings": "Ustawienia Gamepada", + "gamepad/store-in-project": "Zapisz ustawienia w projekcie, aby zastąpić domyślną konfigurację (narzędzie eksperymentalne dla twórców projektów) .", + "folders/add-to-folder": "dodaj do folderu: {folder}", + "folders/confirm-backpack-folder": "Czy chcesz zapisać cały folder do plecaka?", + "folders/create-folder": "stwórz folder", + "folders/name-not-allowed": "Nieprawidłowa nazwa folderu", + "folders/name-prompt": "Nazwa folderu:", + "folders/name-prompt-title": "Stwórz folder", + "folders/open-folder": "Otwarte", + "folders/remove-folder": "usuń folder", + "folders/remove-from-folder": "usuń z folderu", + "folders/rename-folder": "zmień nazwę folderu", + "folders/rename-folder-prompt": "Zmień nazwę folderu na:", + "folders/rename-folder-prompt-title": "Zmień nazwę folderu", + "block-switching/control_forever": "zawsze", + "block-switching/control_if": "jeżeli", + "block-switching/control_if_else": "jeżeli.. w przeciwnym razie", + "block-switching/control_repeat_until": "powtarzaj aż", + "block-switching/control_wait_until": "czekaj aż", + "block-switching/data_changevariableby": "zmień zmienną", + "block-switching/data_hidelist": "ukryj listę", + "block-switching/data_hidevariable": "ukryj zmienną", + "block-switching/data_insertatlist": "wstaw objekt", + "block-switching/data_replaceitemoflist": "zamień objekt", + "block-switching/data_setvariableto": "ustaw zmienną", + "block-switching/data_showlist": "pokaż listę", + "block-switching/data_showvariable": "pokaż zmienną", + "block-switching/debugger_error": "błąd", + "block-switching/debugger_log": "loguj", + "block-switching/debugger_warn": "ostrzeż", + "block-switching/event_broadcast": "nadaj", + "block-switching/event_broadcastandwait": "nadaj i czekaj", + "block-switching/looks_backdropnumbername": "numer tła lub nazwa", + "block-switching/looks_changeeffectby": "zmień efekt", + "block-switching/looks_changesizeby": "zmień rozmiar", + "block-switching/looks_costumenumbername": "numer kostiumu lub nazwa", + "block-switching/looks_hide": "ukryj", + "block-switching/looks_nextbackdrop": "następne tło", + "block-switching/looks_nextcostume": "następny kostium", + "block-switching/looks_say": "powiedz", + "block-switching/looks_sayforsecs": "powiedz przez sekund", + "block-switching/looks_seteffectto": "ustaw efekt", + "block-switching/looks_setsizeto": "ustaw rozmiar", + "block-switching/looks_show": "pokaż", + "block-switching/looks_switchbackdropto": "zmień tło", + "block-switching/looks_switchbackdroptoandwait": "zmień tło i czekaj", + "block-switching/looks_think": "myśl", + "block-switching/looks_thinkforsecs": "myśl przez sekund", + "block-switching/motion_changexby": "zmień x", + "block-switching/motion_changeyby": "zmień y", + "block-switching/motion_setx": "ustaw x", + "block-switching/motion_sety": "ustaw y", + "block-switching/motion_turnleft": "skręć w lewo", + "block-switching/motion_turnright": "skręć w prawo", + "block-switching/motion_xposition": "pozycja x", + "block-switching/motion_yposition": "pozycja y", + "block-switching/music_changeTempo": "zmień tempo", + "block-switching/music_setTempo": "ustaw tempo", + "block-switching/operator_and": "i", + "block-switching/operator_mod": "modulo", + "block-switching/operator_or": "lub", + "block-switching/pen_changePenColorParamBy": "zmień parametr", + "block-switching/pen_changePenHueBy": "zmień kolor", + "block-switching/pen_changePenShadeBy": "zmień odcień", + "block-switching/pen_changePenSizeBy": "zmień rozmiar", + "block-switching/pen_penDown": "przyłóż pisak", + "block-switching/pen_penUp": "podnieś pisak", + "block-switching/pen_setPenColorParamTo": "ustaw parametr", + "block-switching/pen_setPenHueToNumber": "ustaw kolor", + "block-switching/pen_setPenShadeToNumber": "ustaw odcień", + "block-switching/pen_setPenSizeTo": "ustaw rozmiar", + "block-switching/sensing_mousex": "x myszy", + "block-switching/sensing_mousey": "y myszy", + "block-switching/sound_changeeffectby": "zmień efekt", + "block-switching/sound_changevolumeby": "zmień głośność", + "block-switching/sound_playuntildone": "graj aż się skończy", + "block-switching/sound_seteffectto": "ustaw efekt", + "block-switching/sound_setvolumeto": "ustaw głośność", + "blocks2image/error_blocks_not_added": "Dodaj bloki do przestrzeni roboczej!", + "blocks2image/export_all_to_PNG": "Eksportuj wszystko jako PNG", + "blocks2image/export_all_to_SVG": "Eksportuj wszystko jako SVG", + "blocks2image/export_selected_to_PNG": "Eksportuj blok jako obraz PNG", + "blocks2image/export_selected_to_SVG": "Eksportuj blok jako SVG", + "move-to-top-bottom/bottom": "przenieś na dół", + "move-to-top-bottom/top": "przenieś na górę", + "rename-broadcasts/RENAME_BROADCAST": "Zmień wiadomość", + "rename-broadcasts/RENAME_BROADCAST_MODAL_TITLE": "Zmień Wiadomość", + "rename-broadcasts/RENAME_BROADCAST_TITLE": "Zmień nazwę wszystkich wiadomości \"{name}\" na:", + "swap-local-global/cant-convert-cloud": "\"Zmienne w chmurze\" nie mogą być zamienione na \"Dla jednego duszka\"", + "swap-local-global/cant-convert-conflict": "Nie można zamienić, ponieważ koliduje ze zmiennymi w innym duszku: {sprites}", + "swap-local-global/cant-convert-stage": "Scena nie może mieć zmiennych \"Tylko dla tego duszka\".", + "swap-local-global/cant-convert-to-local": "Nie można zamienić, ponieważ to jest używane przez wiele duszków: {sprites}", + "swap-local-global/cant-convert-used-elsewhere": "Nie można zamienić, ponieważ jest używana przez duszka: {sprite}", + "swap-local-global/edit": "Edytuj właściwości:", + "swap-local-global/edit-list-header": "Edytuj Listę", + "swap-local-global/edit-list-option": "Zmień nazwę lub edytuj listę", + "swap-local-global/edit-variable-header": "Edytuj Zmienną", + "swap-local-global/edit-variable-option": "Zmień nazwę lub edytuj zmienną", + "swap-local-global/to-global": "Zamień na \"Dla wszystkich duszków\"", + "swap-local-global/to-local": "Zamień na \"Tylko dla tego duszka\"", + "hide-stage/hide-stage": "Ukryj scenę" +} \ No newline at end of file diff --git a/src/addons/addons-l10n/pt.json b/src/addons/addons-l10n/pt.json new file mode 100644 index 0000000000000000000000000000000000000000..385612c5fbdda5796a2d65760c4298deb89a5ee7 --- /dev/null +++ b/src/addons/addons-l10n/pt.json @@ -0,0 +1,207 @@ +{ + "editor-devtools/clean-plus": "Limpar Blocos +", + "editor-devtools/copy-all": "Copiar Pilha", + "editor-devtools/copy-block": "Copiar Bloco", + "editor-devtools/cut-block": "Recortar Bloco", + "editor-devtools/lists": "listas", + "editor-devtools/make-space": "Abrir Espaço", + "editor-devtools/orphaned": "{count, plural, one {Ferramentas de desenvolvedor: Deletar 1 bloco redondo órfão?} many {Ferramentas de desenvolvedor: Deletar # blocos redondos órfãos?} other {Ferramentas de desenvolvedor: Deletar # blocos redondos órfãos?} }", + "editor-devtools/paste": "Colar", + "editor-devtools/replace": "Ferramentas de desenvolvedor: Trocar {name} nesse ator pela variável chamada:", + "editor-devtools/swap": "Trocar {var} no Ator", + "editor-devtools/unused-list": "{count, plural, one {Ferramentas de desenvolvedor: Deletar 1 lista local não utilizada? Aqui estão:\n} many {Ferramentas de desenvolvedor: Deletar # listas locais não utilizadas? Aqui está:\n} other {Ferramentas de desenvolvedor: Deletar # listas locais não utilizadas? Aqui está:\n} }", + "editor-devtools/unused-var": "{count, plural, one {Ferramentas de desenvolvedor: Deletar 1 variável local não utilizada? Aqui está:\n} many {Ferramentas de desenvolvedor: Deletar # variáveis locais não utilizadas? Aqui estão:\n} other {Ferramentas de desenvolvedor: Deletar # variáveis locais não utilizadas? Aqui estão:\n} }", + "editor-devtools/var-not-exist": "Essa variável não existe...", + "editor-devtools/variables": "variáveis", + "find-bar/find-placeholder": "Localizar (Ctrl+F)", + "editor-searchable-dropdowns/createBroadcast": "Criar mensagem \"{name}\"", + "editor-searchable-dropdowns/createGlobalList": "Criar lista \"{name}\" para todos os atores", + "editor-searchable-dropdowns/createGlobalVariable": "Criar variável \"{name}\" para todos os atores", + "editor-searchable-dropdowns/createLocalList": "Criar lista \"{name}\" somente para este ator", + "editor-searchable-dropdowns/createLocalVariable": "Criar variável \"{name}\" somente para este ator", + "data-category-tweaks-v2/for-all-sprites": "Para todos os atores:", + "data-category-tweaks-v2/for-this-sprite-only": "Apenas para este ator:", + "data-category-tweaks-v2/list-category": "Listas", + "hide-flyout/lock": "Trancar Paleta", + "hide-flyout/unlock": "Destrancar Paleta", + "mediarecorder/cancel": "Cancelar", + "mediarecorder/click-flag": "Esperando...", + "mediarecorder/click-flag-description": "Clique na bandeira verde para começar a gravar. Clique nesse botão para parar.", + "mediarecorder/option-title": "Opções de Gravação", + "mediarecorder/record-after-flag": "Só começar a gravar quando a bandeira verde for clicada", + "mediarecorder/record-audio": "Incluir sons do projeto", + "mediarecorder/record-audio-description": "Isso não inclui Texto-para-Fala", + "mediarecorder/record-duration": "Tempo de Gravação (em segundos)", + "mediarecorder/record-mic": "Incluir sons do microfone", + "mediarecorder/record-until-stop": "Parar de gravar quando o projeto for parado", + "mediarecorder/record-until-stop-disabled": "Você precisa ativar \"{afterFlagOption}\" para usar essa opção.", + "mediarecorder/start": "Começar", + "mediarecorder/start-delay": "Delay Inicial (em segundos)", + "mediarecorder/starting-in": "Começando em {secs}...", + "mediarecorder/stop": "Parar Gravação", + "debugger/block-error": "erro %s", + "debugger/block-warn": "aviso %s", + "debugger/cannot-pause-player": "O bloco de breakpoint só pode ser usado no editor.", + "debugger/clear": "Limpar", + "debugger/clone-of": "Clone de {sprite}", + "debugger/close": "Fechar", + "debugger/empty-string": "(nenhum texto)", + "debugger/enter-format": "Escolha o formato de exportação:", + "debugger/export": "Exportar", + "debugger/export-desc": "Clique enquanto segura Shift para customizar o formato de exportação.", + "debugger/icon-error": "Erro", + "debugger/icon-warn": "Aviso", + "debugger/log-msg-broadcasted": "Mensagem '{broadcast}' enviada.", + "debugger/log-msg-clone-cap": "Falha ao criar clone de '{sprite}', não é possível criar mais que 300 clones.", + "debugger/log-msg-clone-created": "Clone de '{sprite}' criado.", + "debugger/log-msg-flag-clicked": "Bandeira verde clicada.", + "debugger/no-logs": "Não há registros para mostrar.", + "debugger/no-threads-running": "Nenhuma linha em execução.", + "debugger/step": "Avançar um passo", + "debugger/step-desc": "Executa um bloco.", + "debugger/tab-logs": "Registros", + "debugger/tab-threads": "Linhas de execução", + "debugger/thread": "Linha de execução {id}", + "debugger/unknown-sprite": "(ator desconhecido)", + "debugger/unpause": "Continuar", + "pause/pause": "Pausar", + "color-picker/hex": "cor hex", + "remove-sprite-confirm/confirm": "Quer deletar esse ator?", + "block-count/blocks": "{num, plural, one {1 bloco} many {# blocos} other {# blocos}}", + "onion-skinning/behind": "Atrás", + "onion-skinning/front": "Na frente", + "onion-skinning/layering": "Camada", + "onion-skinning/merge": "Transparente", + "onion-skinning/mode": "Modo", + "onion-skinning/next": "Próximas fantasias", + "onion-skinning/opacity": "Opacidade (%)", + "onion-skinning/opacityStep": "Aumento de opacidade (%)", + "onion-skinning/previous": "Fantasias anteriores", + "onion-skinning/settings": "Configurações de Onion Skinning", + "onion-skinning/tint": "Colorido", + "onion-skinning/toggle": "Ligar/Desligar Onion Skinning", + "2d-color-picker/shade": "Tom", + "better-img-uploads/upload": "Carregar Fantasia HD", + "variable-manager/for-all-sprites": "Variáveis para todos os atores", + "variable-manager/for-this-sprite": "Variáveis desse ator", + "variable-manager/search": "Buscar", + "variable-manager/variables": "Variáveis", + "search-sprites/placeholder": "Buscar atores...", + "gamepad/axes-a-b": "Direcionais {a} e {b}", + "gamepad/axis-arrows": "Setinhas", + "gamepad/axis-custom": "Customizado", + "gamepad/axis-none": "Nenhum", + "gamepad/browser-support": "Esse navegador e sistema operacional têm bugs que dificultam o uso desse addon. Tente outro navegador se você encontrar problemas.", + "gamepad/button-n": "Botão {n}", + "gamepad/clear": "Limpar todos os controles", + "gamepad/config-header": "Esse comentário contém configuração de suporte para controle em sites e ferramentas de terceiros como https://turbowarp.org/\nNão edite manualmente", + "gamepad/key-click": "Clique", + "gamepad/key-down": "Baixo", + "gamepad/key-left": "Esquerda", + "gamepad/key-none": "(nenhum)", + "gamepad/key-right": "Direita", + "gamepad/key-space": "Espaço", + "gamepad/key-up": "Cima", + "gamepad/keyinput-title": "Clique e aperte uma tecla ou clique para trocar o botão. Aperte Esc para cancelar. Aperte Backspace ou Delete para apagar.", + "gamepad/no-controllers": "Nenhum controle detectado. Tente conectar um e apertar um botão nele.", + "gamepad/reset": "Redefinir todos os controles ao padrão do projeto", + "gamepad/settings": "Configurações do Controle", + "gamepad/store-in-project": "Guardar essas configurações no projeto para sobrescrever configuração padrão (Ferramenta experimental para criadores de projeto)", + "folders/add-to-folder": "adicionar à pasta: {folder}", + "folders/closed-folder": "Pasta", + "folders/confirm-backpack-folder": "Salvar pasta inteira na mochila?", + "folders/create-folder": "criar pasta", + "folders/name-not-allowed": "Nome de pasta inválido", + "folders/name-prompt": "Nome da pasta:", + "folders/name-prompt-title": "Criar Pasta", + "folders/open-folder": "Aberta", + "folders/remove-folder": "remover pasta", + "folders/remove-from-folder": "remover da pasta", + "folders/rename-folder": "renomear pasta", + "folders/rename-folder-prompt": "Renomear pasta para:", + "folders/rename-folder-prompt-title": "Renomear Pasta", + "block-switching/control_forever": "sempre", + "block-switching/control_if": "se", + "block-switching/control_if_else": "se... senão", + "block-switching/control_repeat_until": "repita até que", + "block-switching/control_wait_until": "espere até que", + "block-switching/data_changevariableby": "adicionar à variável", + "block-switching/data_hidelist": "esconder lista", + "block-switching/data_hidevariable": "esconder variável", + "block-switching/data_insertatlist": "insira um item", + "block-switching/data_replaceitemoflist": "substitua um item", + "block-switching/data_setvariableto": "mude a variável para", + "block-switching/data_showlist": "mostrar lista", + "block-switching/data_showvariable": "mostrar variável", + "block-switching/debugger_error": "erro", + "block-switching/debugger_warn": "aviso", + "block-switching/event_broadcast": "transmita", + "block-switching/event_broadcastandwait": "transmita e espere", + "block-switching/looks_backdropnumbername": "número ou nome do cenário", + "block-switching/looks_changeeffectby": "mude ao efeito", + "block-switching/looks_changesizeby": "mude no tamanho", + "block-switching/looks_costumenumbername": "número ou nome da fantasia", + "block-switching/looks_hide": "esconda", + "block-switching/looks_nextbackdrop": "próximo cenário", + "block-switching/looks_nextcostume": "próxima fantasia", + "block-switching/looks_say": "diga", + "block-switching/looks_sayforsecs": "diga por segundos", + "block-switching/looks_seteffectto": "defina o efeito como", + "block-switching/looks_setsizeto": "defina o tamanho como", + "block-switching/looks_show": "mostre", + "block-switching/looks_switchbackdropto": "mude para o cenário", + "block-switching/looks_switchbackdroptoandwait": "mude para o cenário e espere", + "block-switching/looks_think": "pense", + "block-switching/looks_thinkforsecs": "pense por segundos", + "block-switching/motion_changexby": "adicione a x", + "block-switching/motion_changeyby": "adicione a y", + "block-switching/motion_setx": "mude x para", + "block-switching/motion_sety": "mude y para", + "block-switching/motion_turnleft": "gire para a esquerda", + "block-switching/motion_turnright": "gire para a direita", + "block-switching/motion_xposition": "posição x", + "block-switching/motion_yposition": "posição y", + "block-switching/music_changeTempo": "adicionar ao ritmo", + "block-switching/music_setTempo": "mudar ritmo para", + "block-switching/operator_and": "e", + "block-switching/operator_mod": "resto de... por...", + "block-switching/operator_or": "ou", + "block-switching/pen_changePenColorParamBy": "adicione ao parâmetro", + "block-switching/pen_changePenHueBy": "adicione à cor", + "block-switching/pen_changePenShadeBy": "adicione ao tom", + "block-switching/pen_changePenSizeBy": "adicione ao tamanho", + "block-switching/pen_penDown": "use a caneta", + "block-switching/pen_penUp": "levante a caneta", + "block-switching/pen_setPenColorParamTo": "mude o parâmetro para", + "block-switching/pen_setPenHueToNumber": "mude a cor para", + "block-switching/pen_setPenShadeToNumber": "mude o tom para", + "block-switching/pen_setPenSizeTo": "mude o tamanho para", + "block-switching/sensing_mousex": "posição x do mouse", + "block-switching/sensing_mousey": "posição y do mouse", + "block-switching/sound_changeeffectby": "adicione ao efeito", + "block-switching/sound_changevolumeby": "adicione ao volume", + "block-switching/sound_play": "toque", + "block-switching/sound_playuntildone": "toque o som até o fim", + "block-switching/sound_seteffectto": "mude o efeito para", + "block-switching/sound_setvolumeto": "mude o volume para", + "blocks2image/error_blocks_not_added": "Adicione blocos à área de trabalho!", + "blocks2image/export_all_to_PNG": "Exportar tudo como PNG", + "blocks2image/export_all_to_SVG": "Exportar tudo como SVG", + "blocks2image/export_selected_to_PNG": "Exportar bloco como PNG", + "blocks2image/export_selected_to_SVG": "Exportar blocos como SVG", + "move-to-top-bottom/bottom": "mover ao fundo", + "move-to-top-bottom/top": "mover ao topo", + "swap-local-global/cant-convert-cloud": "Variáveis na nuvem não podem ser convertidas para apenas para este ator.", + "swap-local-global/cant-convert-conflict": "Não foi possível converter porque o nome dessa variável iria causar conflitos com outro ator: {sprites}", + "swap-local-global/cant-convert-stage": "O palco não pode ter variáveis apenas para este ator.", + "swap-local-global/cant-convert-to-local": "Não foi possível converter porque essa variável é usada por vários atores: {sprites}", + "swap-local-global/cant-convert-used-elsewhere": "Não foi possível converter porque essa variável é usada por outro ator: {sprite}", + "swap-local-global/edit": "Editar propriedades:", + "swap-local-global/edit-list-header": "Editar Lista", + "swap-local-global/edit-list-option": "Renomear ou editar lista", + "swap-local-global/edit-variable-header": "Editar Variável", + "swap-local-global/edit-variable-option": "Renomear ou editar variável", + "swap-local-global/to-global": "Converter para \"Para todos os atores\"", + "swap-local-global/to-local": "Converter para \"Apenas para este ator\"", + "hide-stage/hide-stage": "Esconder palco" +} \ No newline at end of file diff --git a/src/addons/addons-l10n/ro.json b/src/addons/addons-l10n/ro.json new file mode 100644 index 0000000000000000000000000000000000000000..e5c75f13bfd772aaf40cb68c087bff265c2d54e2 --- /dev/null +++ b/src/addons/addons-l10n/ro.json @@ -0,0 +1,136 @@ +{ + "editor-devtools/copy-all": "Copiază Toate", + "editor-devtools/copy-block": "Copiază Blocul", + "editor-devtools/cut-block": "Decupează Blocul", + "editor-devtools/lists": "liste", + "editor-devtools/make-space": "Fă spațiu", + "editor-devtools/paste": "Inserează", + "editor-devtools/var-not-exist": "Acea variabilă nu există...", + "editor-devtools/variables": "variabile", + "data-category-tweaks-v2/for-all-sprites": "Pentru toate personajele:", + "data-category-tweaks-v2/for-this-sprite-only": "Doar pentru acest personaj:", + "data-category-tweaks-v2/list-category": "Liste", + "mediarecorder/cancel": "Anulează", + "mediarecorder/click-flag": "Se așteaptă...", + "mediarecorder/click-flag-description": "Apasă pe steagul verde pentru a începe să înregistrezi. Apasă acest buton pentru a o opri.", + "mediarecorder/option-title": "Opțiuni pentru Înregistrare", + "mediarecorder/record-after-flag": "Nu porni înregistrarea până nu se apasă pe Steagul Verde", + "mediarecorder/record-audio": "Include sunetele proiectului", + "mediarecorder/record-audio-description": "Asta nu include Text-în-Vorbire.", + "mediarecorder/record-duration": "Durata înregistrării (în secunde)", + "mediarecorder/record-mic": "Include sunete de la microfon", + "mediarecorder/record-until-stop": "Oprește înregistrarea la oprirea proiectului", + "mediarecorder/record-until-stop-disabled": "Ai nevoie să activezi „{afterFlagOption}” pentru a folosi această opțiune.", + "mediarecorder/start": "Pornește", + "mediarecorder/stop": "Oprește Înregistrarea", + "pause/pause": "Întrerupe", + "clones/clones": "clone: {cloneCount}", + "color-picker/hex": "culoare hex", + "remove-sprite-confirm/confirm": "Vrei să ștergi acest personaj?", + "block-count/blocks": "{num, plural, one {1 bloc} few {# blocuri} other {# de blocuri}}", + "onion-skinning/behind": "În spate", + "onion-skinning/front": "Deasupra", + "onion-skinning/layering": "Stratificare", + "onion-skinning/merge": "Combină", + "onion-skinning/mode": "Mod", + "onion-skinning/next": "Costume următoare", + "onion-skinning/opacity": "Opacitate (%)", + "onion-skinning/opacityStep": "Creșterea Opacității (%)", + "onion-skinning/previous": "Costume anterioare", + "onion-skinning/settings": "Setări pentru modul Costume Suprapuse", + "onion-skinning/tint": "Nuanțe", + "onion-skinning/toggle": "Pornește/Oprește modul Costume Suprapuse", + "2d-color-picker/shade": "Umbră", + "variable-manager/for-all-sprites": " Variabile pentru toate personaj", + "variable-manager/for-this-sprite": " Variabile pentru acest personaj", + "variable-manager/search": "Caută", + "variable-manager/variables": "Variabile", + "search-sprites/placeholder": "Caută personaje...", + "gamepad/axes-a-b": "Axele {a} și {b}", + "gamepad/axis-arrows": "Taste săgeți", + "gamepad/axis-none": "Nimic", + "gamepad/button-n": "Buton {n}", + "gamepad/key-click": "Clic", + "gamepad/key-down": "Jos", + "gamepad/key-left": "Stânga", + "gamepad/key-none": "(nimic)", + "gamepad/key-right": "Dreapta", + "gamepad/key-space": "Spațiu", + "gamepad/key-up": "Sus", + "gamepad/no-controllers": "Niciun controller detectat. Încearcă să conectezi unul și să apeși un buton de pe el.", + "gamepad/settings": "Setări gamepad", + "folders/add-to-folder": "adaugă în dosar: {folder}", + "folders/closed-folder": "Dosar", + "folders/confirm-backpack-folder": "Salvezi întregul folder în Rucsac?", + "folders/create-folder": "creează dosar", + "folders/name-not-allowed": "Nume de dosar invalid", + "folders/name-prompt": "Numele dosarului:", + "folders/open-folder": "Deschis", + "folders/remove-folder": "elimină dosar", + "folders/remove-from-folder": "elimină din dosar", + "folders/rename-folder": "redenumește dosar", + "folders/rename-folder-prompt": "Redenumește dosar la:", + "block-switching/control_forever": "la infinit", + "block-switching/control_if": "dacă", + "block-switching/control_if_else": "dacă... altfel", + "block-switching/control_repeat_until": "repetă până când", + "block-switching/control_wait_until": "așteaptă până când", + "block-switching/data_changevariableby": "schimbă variabila", + "block-switching/data_hidelist": "ascunde lista", + "block-switching/data_hidevariable": "ascunde variabila", + "block-switching/data_insertatlist": "inserează element", + "block-switching/data_replaceitemoflist": "înlocuiește element", + "block-switching/data_setvariableto": "setează variabila", + "block-switching/data_showlist": "arată lista", + "block-switching/data_showvariable": "arată variabila", + "block-switching/event_broadcast": "difuzează", + "block-switching/event_broadcastandwait": "difuzează și așteaptă", + "block-switching/looks_backdropnumbername": "număr sau nume decor", + "block-switching/looks_changeeffectby": "modifică efect", + "block-switching/looks_changesizeby": "modifică mărimea", + "block-switching/looks_costumenumbername": "număr sau nume costum", + "block-switching/looks_hide": "ascunde", + "block-switching/looks_nextbackdrop": "decorul următor", + "block-switching/looks_nextcostume": "costumul următor", + "block-switching/looks_say": "spune", + "block-switching/looks_sayforsecs": "spune pentru secunde", + "block-switching/looks_seteffectto": "setează efectul", + "block-switching/looks_setsizeto": "setează mărimea", + "block-switching/looks_show": "arată", + "block-switching/looks_switchbackdropto": "schimbă decorul", + "block-switching/looks_switchbackdroptoandwait": "schimbă decorul și așteaptă", + "block-switching/looks_think": "gândește", + "block-switching/looks_thinkforsecs": "gândește pentru secunde", + "block-switching/motion_changexby": "schimbă x", + "block-switching/motion_changeyby": "schimbă y", + "block-switching/motion_setx": "setează x", + "block-switching/motion_sety": "setează y", + "block-switching/motion_turnleft": "rotește-te la stânga", + "block-switching/motion_turnright": "rotește-te la dreapta", + "block-switching/motion_xposition": "poziția x", + "block-switching/motion_yposition": "poziția y", + "block-switching/music_changeTempo": "schimbă ritmul", + "block-switching/music_setTempo": "setează viteza", + "block-switching/operator_and": "și", + "block-switching/operator_or": "sau", + "block-switching/pen_changePenColorParamBy": "modifică parametru", + "block-switching/pen_changePenHueBy": "modifică nuanța", + "block-switching/pen_changePenShadeBy": "modifică transparența", + "block-switching/pen_changePenSizeBy": " modifică mărimea", + "block-switching/pen_penDown": "stilou jos", + "block-switching/pen_penUp": "stilou sus", + "block-switching/pen_setPenColorParamTo": "setează parametru", + "block-switching/pen_setPenHueToNumber": "setează nuanța", + "block-switching/pen_setPenShadeToNumber": "setează transparența", + "block-switching/pen_setPenSizeTo": "setează mărimea", + "block-switching/sound_changeeffectby": "modifică efectul", + "block-switching/sound_changevolumeby": "modifică volumul", + "block-switching/sound_playuntildone": "redă sunetul până la final", + "block-switching/sound_seteffectto": "setează efectul", + "block-switching/sound_setvolumeto": "setează volumul", + "blocks2image/error_blocks_not_added": "Adaugă câteva blocuri în spațiul de lucru!", + "move-to-top-bottom/bottom": "mută în partea de jos", + "move-to-top-bottom/top": "mută în vârf", + "swap-local-global/edit-list-header": "Editează lista", + "swap-local-global/edit-variable-header": "Editează Variabila" +} \ No newline at end of file diff --git a/src/addons/addons-l10n/ru.json b/src/addons/addons-l10n/ru.json new file mode 100644 index 0000000000000000000000000000000000000000..58f4e970d62c2e4beb61c4527ebd0a37a8b7090f --- /dev/null +++ b/src/addons/addons-l10n/ru.json @@ -0,0 +1,241 @@ +{ + "editor-devtools/clean-plus": "Очистить блоки +", + "editor-devtools/copy-all": "Копировать все", + "editor-devtools/copy-block": "Копировать блок", + "editor-devtools/cut-block": "Вырезать блок", + "editor-devtools/lists": "списки", + "editor-devtools/make-space": "Сделать пространство", + "editor-devtools/orphaned": "{count, plural, one {Инструменты разработчика: Удалить неиспользуемый блок сенсора?} few {Инструменты разработчика: Удалить # неиспользуемых блоков сенсора?} many {Инструменты разработчика: Удалить # неиспользуемых блоков сенсора?} other {Инструменты разработчика: Удалить # неиспользуемых блоков сенсора? } }", + "editor-devtools/paste": "Вставить", + "editor-devtools/replace": "Инструменты разработчика: Сделать все {name} у этого спрайта переменной названной:", + "editor-devtools/swap": "Сделать {var} для спрайта", + "editor-devtools/unused-list": "{count, plural, one {Инструменты разработчика: Удалить неиспользуемый локальный список? Вот он:\n} few {Инструменты разработчика: удалить # не используемых локальных списков? Вот они:\n} many {Инструменты разработчика: Удалить # неиспользуемых локальных листов? Вот они:\n} other {Инструменты разработчика: Удалить # неиспользуемых локальных списков? Вот они:\n} }", + "editor-devtools/unused-var": "{count, plural, one {Инструменты разработчика: Удалить неиспользуемую локальную переменную? Вот она:\n} few {Инструменты разработчика: Удалить # неиспользуемых локальных переменных? Вот они:\n} many {Инструменты разработчика: Удалить # неиспользуемых локальных переменных? Вот они:\n} other {Инструменты разработчика: Удалить # неиспользуемых локальных переменных? Вот они:\n} }", + "editor-devtools/var-not-exist": "Эта переменная не существует...", + "editor-devtools/variables": "переменные", + "find-bar/complex-broadcast": "(выделение)", + "find-bar/find-placeholder": "Поиск (Ctrl+F)", + "middle-click-popup/start-typing": "Начните печатать...", + "editor-searchable-dropdowns/createBroadcast": "Создать сообщение \"{name}\"", + "editor-searchable-dropdowns/createGlobalList": "Создать список \"{name}\" для всех спрайтов", + "editor-searchable-dropdowns/createGlobalVariable": "Создать переменную \"{name}\" для всех спрайтов", + "editor-searchable-dropdowns/createLocalList": "Создать список \"{name}\" только для этого спрайта", + "editor-searchable-dropdowns/createLocalVariable": "Создать переменную \"{name}\" только для этого спрайта", + "data-category-tweaks-v2/for-all-sprites": "Для всех спрайтов:", + "data-category-tweaks-v2/for-this-sprite-only": "Только для этого спрайта:", + "data-category-tweaks-v2/list-category": "Списки", + "hide-flyout/lock": "Заблокировать палитру", + "hide-flyout/unlock": "Разблокировать палитру", + "mediarecorder/cancel": "Отмена", + "mediarecorder/click-flag": "Ожидание...", + "mediarecorder/click-flag-description": "Нажмите зеленый флаг, чтобы начать запись. Нажмите эту кнопку, чтобы остановить.", + "mediarecorder/option-title": "Настройки записи", + "mediarecorder/record-after-flag": "Не начинать запись, пока не нажат зеленый флаг", + "mediarecorder/record-audio": "Включить звуки проекта", + "mediarecorder/record-audio-description": "Это не включает Text-to-Speech.", + "mediarecorder/record-duration": "Продолжительность записи (в секундах)", + "mediarecorder/record-mic": "Включить звуки из микрофона", + "mediarecorder/record-until-stop": "Остановить запись после остановки проекта", + "mediarecorder/record-until-stop-disabled": "Вы должны включить \"{afterFlagOption}\", чтобы использовать эту настройку.", + "mediarecorder/start": "Начать", + "mediarecorder/start-delay": "Задержка старта (в секундах)", + "mediarecorder/starting-in": "Старт через {secs}...", + "mediarecorder/stop": "Остановить запись", + "debugger/block-breakpoint": "приостановить", + "debugger/block-error": "ошибка %s", + "debugger/block-log": "логировать %s", + "debugger/block-warn": "предупредить %s", + "debugger/cannot-pause-player": "Блок точки остановки может быть использовать только в редакторе.", + "debugger/clear": "Очистить", + "debugger/clone-of": "Клон {sprite}", + "debugger/close": "Закрыть", + "debugger/console": "Логи", + "debugger/debug": "Отладка", + "debugger/empty-string": "(пустая строка)", + "debugger/enter-format": "Введите формат экспорта:", + "debugger/export": "Экспорт", + "debugger/export-desc": "Щелкните, удерживая Shift, чтобы настроить формат экспорта.", + "debugger/icon-error": "Ошибка", + "debugger/icon-warn": "Предупреждение", + "debugger/log-msg-broadcasted": "Передали «{broadcast}».", + "debugger/log-msg-clone-cap": "Не удалось создать клон '{sprite}', невозможно создать более 300 клонов.", + "debugger/log-msg-clone-created": "Создан клон '{sprite}'.", + "debugger/log-msg-flag-clicked": "Зелёный флаг нажат.", + "debugger/no-logs": "Нет логов для показа.", + "debugger/no-threads-running": "Потоки не выполняются.", + "debugger/step": "Шаг", + "debugger/step-desc": "Выполнить один блок.", + "debugger/tab-logs": "Логи", + "debugger/tab-threads": "Потоки", + "debugger/thread": "Поток {id}", + "debugger/unknown-sprite": "(неизвестный спрайт)", + "debugger/unpause": "Продолжить", + "pause/pause": "Пауза", + "clones/clones": "клонов: {cloneCount}", + "color-picker/hex": "цвет hex", + "remove-sprite-confirm/confirm": "Вы хотите удалить спрайт?", + "block-count/blocks": "{num, plural, one {1 блок} few {# блока} many {# блоков} other {# блоков}}", + "onion-skinning/behind": "Сзади", + "onion-skinning/front": "Впереди", + "onion-skinning/layering": "Наслоение", + "onion-skinning/merge": "Объединить", + "onion-skinning/mode": "Режим", + "onion-skinning/next": "Следующие костюмы", + "onion-skinning/opacity": "Непрозрачность (%)", + "onion-skinning/opacityStep": "Шаг непрозрачности (%)", + "onion-skinning/previous": "Прошлые костюмы", + "onion-skinning/settings": "Настройки отображения предыдущих костюмов", + "onion-skinning/tint": "Оттенок", + "onion-skinning/toggle": "Включить отображение предыдущих костюмов", + "paint-snap/boxCenter": "Центра выбора", + "paint-snap/boxCorners": "Углов выбора", + "paint-snap/boxEdgeMids": "Средних точек выбора", + "paint-snap/objectCenters": "Центру объектов", + "paint-snap/objectCorners": "Углам объектов", + "paint-snap/objectEdges": "Границам объектов", + "paint-snap/objectMidlines": "средним линиям объектов", + "paint-snap/off": "Выкл", + "paint-snap/on": "Вкл", + "paint-snap/pageAxes": "Осям x и y", + "paint-snap/pageCenter": "Центру", + "paint-snap/pageCorners": "Углам", + "paint-snap/pageEdges": "Границам", + "paint-snap/settings": "Настройки привязки", + "paint-snap/snapFrom": "Привязка от:", + "paint-snap/snapTo": "Привязать к:", + "paint-snap/threshold": "Дистанция привязки", + "paint-snap/toggle": "Включить привязку", + "2d-color-picker/shade": "Оттенок", + "better-img-uploads/upload": "HD загрузка", + "variable-manager/for-all-sprites": "Переменные всех спрайтов", + "variable-manager/for-this-sprite": "Переменные этого спрайта", + "variable-manager/search": "Поиск", + "variable-manager/variables": "Переменные", + "search-sprites/placeholder": "Искать спрайты...", + "sprite-properties/close-properties-panel-tooltip": "Спрятать панель со свойствами", + "sprite-properties/open-properties-panel-tooltip": "Открыть панель со свойствами", + "gamepad/axes-a-b": "Оси {a}и{b}", + "gamepad/axis-arrows": "Клавиши стрелок", + "gamepad/axis-cursor": "Курсор", + "gamepad/axis-custom": "Настраиваемый", + "gamepad/axis-none": "Ничего", + "gamepad/browser-support": "Этот браузер и операционная система имеют известные баги, которые могут повлиять на использование этого аддона. Попробуйте др. браузер, если у Вас появятся проблемы.", + "gamepad/button-n": "Кнопка{n}", + "gamepad/clear": "Очистить все элементы управления", + "gamepad/config-header": "Этот комментарий содержит конфигурацию для поддержки геймпада в сторонних инструментах или сайтах по типу https://turbowarp.org/\nНе редактировать самим", + "gamepad/key-click": "Нажатие", + "gamepad/key-down": "Вниз", + "gamepad/key-enter": "Ввод", + "gamepad/key-left": "Налево", + "gamepad/key-none": "(ничего)", + "gamepad/key-right": "Направо", + "gamepad/key-space": "Пробел", + "gamepad/key-up": "Вверх", + "gamepad/keyinput-title": "Кликните и нажмите клавишу или кликните для смены кнопки. Esc для отмены. Backspace или Delete для очистки.", + "gamepad/no-controllers": "Не обнаружены контроллеры. Попробуйте подключить какой-нибудь контроллер и нажать на нём кнопку.", + "gamepad/reset": "Сменить управление на стандартное", + "gamepad/settings": "Настройки геймпада", + "gamepad/store-in-project": "Хранить эти настройки в проекте для обхода конфигурации по умолчанию (Экспериментальный инструмент для создателей проектов)", + "folders/add-to-folder": "добавить к папке: {folder}", + "folders/closed-folder": "Папка", + "folders/confirm-backpack-folder": "Сохранить всю папку в рюкзак?", + "folders/create-folder": "создать папку", + "folders/name-not-allowed": "Неверное имя папки", + "folders/name-prompt": "Название папки:", + "folders/name-prompt-title": "Создание папки", + "folders/open-folder": "Открыто", + "folders/remove-folder": "удалить папку", + "folders/remove-from-folder": "удалить из папки", + "folders/rename-folder": "переименовать папку", + "folders/rename-folder-prompt": "Переименовать папку в:", + "folders/rename-folder-prompt-title": "Переименование папки", + "block-switching/control_forever": "всегда", + "block-switching/control_if": "если", + "block-switching/control_if_else": "если... иначе", + "block-switching/control_repeat_until": "повторять до", + "block-switching/control_wait_until": "ждать до", + "block-switching/data_changevariableby": "изменить переменную", + "block-switching/data_hidelist": "скрыть список", + "block-switching/data_hidevariable": "спрятать переменную", + "block-switching/data_insertatlist": "вставить элемент", + "block-switching/data_replaceitemoflist": "заменить элемент", + "block-switching/data_setvariableto": "установить переменную", + "block-switching/data_showlist": "показать список", + "block-switching/data_showvariable": "показать переменную", + "block-switching/debugger_error": "ошибка", + "block-switching/debugger_log": "лог", + "block-switching/debugger_warn": "предупредить", + "block-switching/event_broadcast": "передать", + "block-switching/event_broadcastandwait": "передать и ждать до конца", + "block-switching/looks_backdropnumbername": "номер фона или имя фона", + "block-switching/looks_changeeffectby": "изменить эффект", + "block-switching/looks_changesizeby": "изменить размер", + "block-switching/looks_costumenumbername": "номер костюма или имя костюма", + "block-switching/looks_hide": "спрятаться", + "block-switching/looks_nextbackdrop": "следующий фон", + "block-switching/looks_nextcostume": "следующий костюм", + "block-switching/looks_say": "сказать", + "block-switching/looks_sayforsecs": "говорить секунд", + "block-switching/looks_seteffectto": "установить эффект", + "block-switching/looks_setsizeto": "установить размер", + "block-switching/looks_show": "показаться", + "block-switching/looks_switchbackdropto": "переключить фон на", + "block-switching/looks_switchbackdroptoandwait": "изменить фон и ждать", + "block-switching/looks_think": "думать", + "block-switching/looks_thinkforsecs": "думать секунд", + "block-switching/motion_changexby": "изменить x", + "block-switching/motion_changeyby": "изменить y", + "block-switching/motion_setx": "установить x", + "block-switching/motion_sety": "установить y", + "block-switching/motion_turnleft": "повернуть налево", + "block-switching/motion_turnright": "повернуть направо", + "block-switching/motion_xposition": "позиция x", + "block-switching/motion_yposition": "позиция y", + "block-switching/music_changeTempo": "изменить темп", + "block-switching/music_setTempo": "задать темп", + "block-switching/operator_and": "и", + "block-switching/operator_mod": "мод", + "block-switching/operator_or": "или", + "block-switching/pen_changePenColorParamBy": "изменить параметр", + "block-switching/pen_changePenHueBy": "изменить цвет", + "block-switching/pen_changePenShadeBy": "изменить оттенок", + "block-switching/pen_changePenSizeBy": "изменить размер", + "block-switching/pen_penDown": "опустить перо", + "block-switching/pen_penUp": "поднять перо", + "block-switching/pen_setPenColorParamTo": "задать параметр", + "block-switching/pen_setPenHueToNumber": "задать цвет", + "block-switching/pen_setPenShadeToNumber": "задать оттенок", + "block-switching/pen_setPenSizeTo": "задать размер", + "block-switching/sensing_mousex": "x мыши", + "block-switching/sensing_mousey": "y мыши", + "block-switching/sound_changeeffectby": "изменить эффект", + "block-switching/sound_changevolumeby": "изменить громкость", + "block-switching/sound_play": "включить звук", + "block-switching/sound_playuntildone": "проигрывать до конца", + "block-switching/sound_seteffectto": "задать эффект", + "block-switching/sound_setvolumeto": "задать громкость", + "blocks2image/error_blocks_not_added": "Добавить блоки на рабочую область!", + "blocks2image/export_all_to_PNG": "Экспорт всех блоков в формате PNG", + "blocks2image/export_all_to_SVG": "Экспорт всех блоков в SVG", + "blocks2image/export_selected_to_PNG": "Экспорт блока как PNG", + "blocks2image/export_selected_to_SVG": "Экспорт блока в формате SVG", + "editor-extra-keys/enter-key": "ввод", + "move-to-top-bottom/bottom": "переместить вниз", + "move-to-top-bottom/top": "переместить наверх", + "rename-broadcasts/RENAME_BROADCAST": "Переименовать сообщение", + "rename-broadcasts/RENAME_BROADCAST_MODAL_TITLE": "Переименовать Сообщение", + "rename-broadcasts/RENAME_BROADCAST_TITLE": "переименовать \"{name}\" сообщений в:", + "swap-local-global/cant-convert-cloud": "Облачные переменные нельзя преобразовать только в этот спрайт.", + "swap-local-global/cant-convert-conflict": "Невозможно сконвертировать, так как будет конфликт с переменными в другом спрайте: {sprites}", + "swap-local-global/cant-convert-stage": "В сцене не может быть переменных только для этого спрайта.", + "swap-local-global/cant-convert-to-local": "Невозможно преобразовать, потому что используется несколькими спрайтами:{sprites}", + "swap-local-global/cant-convert-used-elsewhere": "Невозможно сконвертировать, т. к. оно уже используется другим спрайтом: {sprite}", + "swap-local-global/edit": "Изменить свойства:", + "swap-local-global/edit-list-header": "Изменить список", + "swap-local-global/edit-list-option": "Переименовать или изменить список", + "swap-local-global/edit-variable-header": "Изменить переменную", + "swap-local-global/edit-variable-option": "Переименовать или изменить переменную", + "swap-local-global/to-global": "Конвертировать в \"Для всех спрайтов\"", + "swap-local-global/to-local": "Конвертировать в \"Для всех спрайтов\"", + "hide-stage/hide-stage": "Скрыть сцену" +} \ No newline at end of file diff --git a/src/addons/addons-l10n/sl.json b/src/addons/addons-l10n/sl.json new file mode 100644 index 0000000000000000000000000000000000000000..bae357746f4b8cc47859d4f7453c20b44533724b --- /dev/null +++ b/src/addons/addons-l10n/sl.json @@ -0,0 +1,233 @@ +{ + "editor-devtools/clean-plus": "Počisti bloke +", + "editor-devtools/copy-all": "Kopiraj vse", + "editor-devtools/copy-block": "Kopiraj blok", + "editor-devtools/cut-block": "Izreži blok", + "editor-devtools/lists": "seznami", + "editor-devtools/make-space": "Naredi prostor", + "editor-devtools/orphaned": "{count, plural, one {Developer tools: Naj izbrišem 1 neuporabljen okrogel blok?} two {Developer tools: Naj izbrišem 2 neuporabljena okrogla bloka?} few {Developer tools: Naj izbrišem # neuporabljene okrogle bloke?} other {Orodje za razvijalce: Naj izbrišem # neuporabljenih okroglih blokov?} }", + "editor-devtools/paste": "Prilepi", + "editor-devtools/replace": "Orodje za razvijalce: Zamenjaj vse {name} v tej figuri s spremenljivko z imenom:", + "editor-devtools/swap": "Zamenjaj {var} v figuri", + "editor-devtools/unused-list": "{count, plural, one {Developer tools: Naj izbrišem 1 neuporabljen lokalni seznam? Tukaj je:\n} two {Developer tools: Naj izbrišem 2 neuporabljena lokalna seznama? Tukaj sta:\n} few {Developer tools: Naj izbrišem # neuporabljene lokalne sezname? Tukaj so:\n} other {Orodje za razvijalce: Naj izbrišem # neuporabljenih lokalnih seznamov? Tukaj so:\n} }", + "editor-devtools/unused-var": "{count, plural, one {Developer tools: Naj izbrišem 1 neuporabljeno lokalno spremenljivko? Tukaj je:\n} two {Developer tools: Naj izbrišem 2 neuporabljeni lokalni spremenljivki? Tukaj sta:\n} few {Developer tools: Naj izbrišem # neuporabljene lokalne spremenljivke? Tukaj so:\n} other {Orodje za razvijalce: Naj izbrišem # neuporabljenih lokalnih spremenljivk? Tukaj so:\n} }", + "editor-devtools/var-not-exist": "Ta spremenljivka ne obstaja...", + "editor-devtools/variables": "spremenljivke", + "find-bar/complex-broadcast": "(izraz)", + "find-bar/find-placeholder": "Iskanje (Ctrl+F)", + "middle-click-popup/start-typing": "Začnite tipkati...", + "editor-searchable-dropdowns/createBroadcast": "Ustvari sporočilo \"{name}\"", + "editor-searchable-dropdowns/createGlobalList": "Ustvari seznam \"{name}\" za vse figure", + "editor-searchable-dropdowns/createGlobalVariable": "Ustvari spremenljivko \"{name}\" za vse figure", + "editor-searchable-dropdowns/createLocalList": "Ustvari seznam \"{name}\" samo za to figuro", + "editor-searchable-dropdowns/createLocalVariable": "Ustvari spremenljivko \"{name}\" samo za to figuro", + "data-category-tweaks-v2/for-all-sprites": "Za vse figure:", + "data-category-tweaks-v2/for-this-sprite-only": "Samo za to figuro:", + "data-category-tweaks-v2/list-category": "Seznami", + "hide-flyout/lock": "Zakleni paleto", + "hide-flyout/unlock": "Odkleni paleto", + "mediarecorder/cancel": "Prekliči", + "mediarecorder/click-flag": "Čakanje...", + "mediarecorder/click-flag-description": "Kliknite zeleno zastavico, da začnete snemanje. Kliknite ta gumb, da ga ustavite.", + "mediarecorder/option-title": "Možnosti snemanja", + "mediarecorder/record": "Snemaj", + "mediarecorder/record-after-flag": "Ne začni snemanja, dokler ne kliknem zelene zastavice", + "mediarecorder/record-audio": "Vključi zvoke projekta", + "mediarecorder/record-audio-description": "To ne vključuje razširitve Besedilo v govor.", + "mediarecorder/record-description": "Posnemite oder kot datoteko WebM. Lahko jo shranite na računalnik, ko je snemanje končano.\nSpremenljivke in seznami ne bodo vidni na posnetku.", + "mediarecorder/record-duration": "Trajanje snemanja (v sekundah)", + "mediarecorder/record-mic": "Vključi zvok mikrofona", + "mediarecorder/record-until-stop": "Končaj snemanje, ko se projekt ustavi", + "mediarecorder/record-until-stop-disabled": "Vključite \"{afterFlagOption}\", da uporabite to možnost.", + "mediarecorder/start": "Začni", + "mediarecorder/start-delay": "Začni čez (v sekundah)", + "mediarecorder/starting-in": "Začenjam čez {secs}...", + "mediarecorder/stop": "Ustavi snemanje", + "debugger/block-error": "napaka %s", + "debugger/block-log": "zapiši %s", + "debugger/block-warn": "opozorilo %s", + "debugger/cannot-pause-player": "Blok breakpoint deluje samo v urejevalniku.", + "debugger/clear": "Počisti", + "debugger/clone-of": "Dvojnik figure {sprite}", + "debugger/close": "Zapri", + "debugger/console": "Razhroščevanje", + "debugger/debug": "Razhroščevanje", + "debugger/empty-string": "(prazen niz)", + "debugger/enter-format": "Oblika datoteke za izvoz:", + "debugger/export": "Izvozi", + "debugger/export-desc": "Kliknite, medtem ko držite tipko Shift, da izberete obliko datoteke za izvoz.", + "debugger/icon-error": "Napaka", + "debugger/icon-warn": "Opozorilo", + "debugger/log-msg-broadcasted": "Sporočilo '{broadcast}' objavljeno.", + "debugger/log-msg-clone-cap": "Podvajanje figure '{sprite}' ni uspelo, število dvojnikov je omejeno na 300.", + "debugger/log-msg-clone-created": "Dvojnik figure '{sprite}' narejen.", + "debugger/log-msg-flag-clicked": "Zelena zastavica kliknjena.", + "debugger/no-logs": "Ni zapiskov za prikaz.", + "debugger/no-threads-running": "Nobena nit ne deluje.", + "debugger/step": "Korak", + "debugger/step-desc": "Izvede en blok.", + "debugger/tab-logs": "Zapiski", + "debugger/tab-threads": "Niti", + "debugger/thread": "Nit {id}", + "debugger/unknown-sprite": "(neznana figura)", + "debugger/unpause": "Nadaljuj", + "pause/pause": "Premor", + "clones/clones": "dvojniki: {cloneCount}", + "color-picker/hex": "barva", + "remove-sprite-confirm/confirm": "Želite izbrisati figuro?", + "block-count/blocks": "{num, plural, one {1 blok} two {2 bloka} few {# bloki} other {# blokov}}", + "onion-skinning/behind": "Zadaj", + "onion-skinning/front": "Spredaj", + "onion-skinning/layering": "Plast", + "onion-skinning/merge": "Združi", + "onion-skinning/mode": "Način", + "onion-skinning/next": "Naslednji videzi", + "onion-skinning/opacity": "Neprosojnost (%)", + "onion-skinning/opacityStep": "Sprememba neprosojnosti (%)", + "onion-skinning/previous": "Prejšnji videzi", + "onion-skinning/settings": "Nastavitve za onion skinning", + "onion-skinning/tint": "Barva", + "onion-skinning/toggle": "Vključi ali izključi onion skinning", + "paint-snap/boxCenter": "Središče izbire", + "paint-snap/boxCorners": "Oglišča izbire", + "paint-snap/boxEdgeMids": "Razpolovišča robov izbire", + "paint-snap/objectCenters": "Središča predmetov", + "paint-snap/objectCorners": "Oglišča predmetov", + "paint-snap/objectEdges": "Robovi predmetov", + "paint-snap/objectMidlines": "Osi predmetov", + "paint-snap/pageAxes": "Osi x in y strani", + "paint-snap/pageCenter": "Središče strani", + "paint-snap/pageCorners": "Oglišča strani", + "paint-snap/pageEdges": "Robovi strani", + "2d-color-picker/shade": "Odtenek", + "better-img-uploads/upload": "Naloži HD", + "variable-manager/for-all-sprites": "Spremenljivke za vse figure", + "variable-manager/for-this-sprite": "Spremenljivke za to figuro", + "variable-manager/search": "Iskanje", + "variable-manager/too-big": "Kliknite za prikaz zelo velike vrednosti.", + "variable-manager/variables": "Spremenljivke", + "search-sprites/placeholder": "Iskanje figur...", + "sprite-properties/close-properties-panel-tooltip": "Skrči lastnosti", + "sprite-properties/open-properties-panel-tooltip": "Odpri lastnosti", + "gamepad/axes-a-b": "Osi {a} in {b}", + "gamepad/axis-arrows": "Tipke s puščicami", + "gamepad/axis-cursor": "Kazalec miške", + "gamepad/axis-custom": "Po meri", + "gamepad/axis-none": "Brez", + "gamepad/browser-support": "Ta brskalnik in operacijski sistem imata znane napake, ki lahko naredijo uporabo tega dodatka težjo. Če pride do težav, preizkusite drug brskalnik.", + "gamepad/button-n": "Gumb {n}", + "gamepad/clear": "Izbriši vse", + "gamepad/config-header": "Ta komentar vsebuje nastavitve za podporo igralnih ploščkov v orodju ali spletnih straneh, kot je https://turbowarp.org/\nNe spreminjajte ročno", + "gamepad/key-click": "Klik miške", + "gamepad/key-down": "Dol", + "gamepad/key-left": "Levo", + "gamepad/key-none": "(brez)", + "gamepad/key-right": "Desno", + "gamepad/key-space": "Presledek", + "gamepad/key-up": "Gor", + "gamepad/keyinput-title": "Kliknite in pritisnite tipko ali kliknite z miško, da izberete gumb. Pritisnite tipko Escape za preklic ali Backspace/Delete, da izbrišete vnos.", + "gamepad/no-controllers": "Noben igralni plošček ni bil zaznan. Poskusite ga priključiti in pritisniti gumb na njem.", + "gamepad/reset": "Povrni privzete nastavitve", + "gamepad/settings": "Nastavitve igralnih ploščkov", + "gamepad/store-in-project": "Shrani te nastavitve v projektu, da nadomestijo privzete nastavitve (Preizkusna možnost za ustvarjalce projektov)", + "folders/add-to-folder": "dodaj v mapo: {folder}", + "folders/closed-folder": "Mapa", + "folders/confirm-backpack-folder": "Naj shranim celotno mapo v shrambo?", + "folders/create-folder": "ustvari mapo", + "folders/name-not-allowed": "Neveljavno ime mape", + "folders/name-prompt": "Ime mape:", + "folders/name-prompt-title": "Ustvari mapo", + "folders/open-folder": "Odprta", + "folders/remove-folder": "odstrani mapo", + "folders/remove-from-folder": "odstrani iz mape", + "folders/rename-folder": "preimenuj mapo", + "folders/rename-folder-prompt": "Preimenuj mapo v:", + "folders/rename-folder-prompt-title": "Preimenuj mapo", + "block-switching/control_forever": "ponavljaj", + "block-switching/control_if": "če", + "block-switching/control_if_else": "če ... sicer", + "block-switching/control_repeat_until": "ponavljaj dokler ni", + "block-switching/control_wait_until": "počakaj dokler ni", + "block-switching/data_changevariableby": "spremeni spremenljivko", + "block-switching/data_hidelist": "skrij seznam", + "block-switching/data_hidevariable": "skrij spremenljivko", + "block-switching/data_insertatlist": "vstavi predmet", + "block-switching/data_replaceitemoflist": "zamenjaj predmet", + "block-switching/data_setvariableto": "nastavi spremenljivko", + "block-switching/data_showlist": "pokaži seznam", + "block-switching/data_showvariable": "pokaži spremenljivko", + "block-switching/debugger_error": "napaka", + "block-switching/debugger_log": "zapiši", + "block-switching/debugger_warn": "opozorilo", + "block-switching/event_broadcast": "objavi", + "block-switching/event_broadcastandwait": "objavi in čakaj", + "block-switching/looks_backdropnumbername": "število ali ime ozadja", + "block-switching/looks_changeeffectby": "spremeni učinek", + "block-switching/looks_changesizeby": "spremeni velikost", + "block-switching/looks_costumenumbername": "število ali ime videza", + "block-switching/looks_hide": "skrij", + "block-switching/looks_nextbackdrop": "naslednje ozadje", + "block-switching/looks_nextcostume": "naslednji videz", + "block-switching/looks_say": "reci", + "block-switching/looks_sayforsecs": "reci za ... sekund", + "block-switching/looks_seteffectto": "nastavi učinek", + "block-switching/looks_setsizeto": "nastavi velikost", + "block-switching/looks_show": "pokaži", + "block-switching/looks_switchbackdropto": "zamenjaj ozadje", + "block-switching/looks_switchbackdroptoandwait": "zamenjaj ozadje in počakaj", + "block-switching/looks_think": "pomisli", + "block-switching/looks_thinkforsecs": "pomisli za ... sekund", + "block-switching/motion_changexby": "spremeni x", + "block-switching/motion_changeyby": "spremeni y", + "block-switching/motion_setx": "nastavi x", + "block-switching/motion_sety": "nastavi y", + "block-switching/motion_turnleft": "obrni se levo", + "block-switching/motion_turnright": "obrni se desno", + "block-switching/motion_xposition": "položaj x", + "block-switching/motion_yposition": "položaj y", + "block-switching/music_changeTempo": "spremeni tempo", + "block-switching/music_setTempo": "nastavi tempo", + "block-switching/operator_and": "in", + "block-switching/operator_or": "ali", + "block-switching/pen_changePenColorParamBy": "spremeni parameter", + "block-switching/pen_changePenHueBy": "spremeni barvo", + "block-switching/pen_changePenShadeBy": "spremeni svetlost", + "block-switching/pen_changePenSizeBy": "spremeni velikost", + "block-switching/pen_penDown": "spusti pero", + "block-switching/pen_penUp": "dvigni pero", + "block-switching/pen_setPenColorParamTo": "nastavi parameter", + "block-switching/pen_setPenHueToNumber": "nastavi barvo", + "block-switching/pen_setPenShadeToNumber": "nastavi svetlost", + "block-switching/pen_setPenSizeTo": "nastavi velikost", + "block-switching/sensing_mousex": "miškin x", + "block-switching/sensing_mousey": "miškin y", + "block-switching/sound_changeeffectby": "spremeni učinek", + "block-switching/sound_changevolumeby": "spremeni glasnost", + "block-switching/sound_play": "predvajaj", + "block-switching/sound_playuntildone": "predvajaj do konca", + "block-switching/sound_seteffectto": "nastavi učinek", + "block-switching/sound_setvolumeto": "nastavi glasnost", + "blocks2image/error_blocks_not_added": "Dodajte bloke v delovni prostor!", + "blocks2image/export_all_to_PNG": "Izvozi vse kot PNG", + "blocks2image/export_all_to_SVG": "Izvozi vse kot SVG", + "blocks2image/export_selected_to_PNG": "Izvozi blok kot PNG", + "blocks2image/export_selected_to_SVG": "Izvozi blok kot SVG", + "move-to-top-bottom/bottom": "na dno", + "move-to-top-bottom/top": "na vrh", + "rename-broadcasts/RENAME_BROADCAST": "Preimenuj sporočilo", + "rename-broadcasts/RENAME_BROADCAST_MODAL_TITLE": "Preimenuj sporočilo", + "rename-broadcasts/RENAME_BROADCAST_TITLE": "Preimenuj vsa sporočila \"{name}\" v:", + "swap-local-global/cant-convert-cloud": "Spremenljivke v oblaku ne morejo biti samo za to figuro.", + "swap-local-global/cant-convert-conflict": "Spremenljivke ni mogoče spremeniti, ker ima enako ime kot spremenljivka v drugi figuri: {sprites}", + "swap-local-global/cant-convert-stage": "Oder ne more imeti spremenljivk samo za to figuro.", + "swap-local-global/cant-convert-to-local": "Spremenljivke ni mogoče spremeniti, ker jo uporablja več figur: {sprites}", + "swap-local-global/cant-convert-used-elsewhere": "Spremenljivke ni mogoče spremeniti, ker jo uporablja še ena figura: {sprite}", + "swap-local-global/edit": "Uredi lastnosti:", + "swap-local-global/edit-list-header": "Uredi seznam", + "swap-local-global/edit-list-option": "Preimenuj ali uredi seznam", + "swap-local-global/edit-variable-header": "Uredi spremenljivko", + "swap-local-global/edit-variable-option": "Preimenuj ali uredi spremenljivko", + "swap-local-global/to-global": "Spremeni v \"Za vse figure\"", + "swap-local-global/to-local": "Spremeni v \"Samo za to figuro\"", + "hide-stage/hide-stage": "Skrij oder" +} \ No newline at end of file diff --git a/src/addons/addons-l10n/tr.json b/src/addons/addons-l10n/tr.json new file mode 100644 index 0000000000000000000000000000000000000000..8e3504a6bf16452099f51bbf8f417f3e9a7e4d40 --- /dev/null +++ b/src/addons/addons-l10n/tr.json @@ -0,0 +1,238 @@ +{ + "editor-devtools/clean-plus": "Blokları temizle +", + "editor-devtools/copy-all": "Hepsini Kopyala", + "editor-devtools/copy-block": "Bloğu Kopyala", + "editor-devtools/cut-block": "Bloğu Kes", + "editor-devtools/lists": "listeler", + "editor-devtools/make-space": "Boşluk Yap", + "editor-devtools/orphaned": "{count, plural, one {Geliştirici araçları: Tanımsız 1 haberci bloğu silinsin mi?} other {Geliştirici araçları: Tanımsız # haberci bloğu silinsin mi?} }", + "editor-devtools/paste": "Yapıştır", + "editor-devtools/replace": "Geliştirici araçları: {name} değişkeni için bu kuklanın tümünü değiştirin:", + "editor-devtools/swap": "Kuklada {var}'i değiştir", + "editor-devtools/unused-list": "{count, plural, one {Geliştirici araçları: Kullanılmayan 1 yerel liste silinsin mi? İşte buradalar:\n} other {Geliştirici araçları: Kullanılmayan # yerel liste silinsin mi? İşte buradalar:\n} }", + "editor-devtools/unused-var": "{count, plural, one {Geliştirici araçları: Kullanılmayan 1 yerel değişken silinsin mi? İşte buradalar:\n} other {Geliştirici araçları: Kullanılmayan # yerel değişken silinsin mi? İşte buradalar:\n} }", + "editor-devtools/var-not-exist": "Bu değişken mevcut değil...", + "editor-devtools/variables": "değişkenler", + "find-bar/complex-broadcast": "(ifade)", + "find-bar/find-placeholder": "Ara (Ctrl+F)", + "middle-click-popup/start-typing": "Yazmaya Başla...", + "editor-searchable-dropdowns/createBroadcast": "\"{name}\" mesajını oluştur", + "editor-searchable-dropdowns/createGlobalList": "Tüm kuklalar için \"{name}\" listesini oluştur", + "editor-searchable-dropdowns/createGlobalVariable": "Tüm kuklalar için \"{name}\" değişkenini oluştur", + "editor-searchable-dropdowns/createLocalList": "Sadece bu kukla için \"{name}\" listesini oluştur", + "editor-searchable-dropdowns/createLocalVariable": "Sadece bu kukla için \"{name}\" değişkenini oluştur", + "data-category-tweaks-v2/for-all-sprites": "Tüm kuklalar için:", + "data-category-tweaks-v2/for-this-sprite-only": "Sadece bu kukla için:", + "data-category-tweaks-v2/list-category": "Listeler", + "hide-flyout/lock": "Paleti Kilitle", + "hide-flyout/unlock": "Paletin Kilidini Aç", + "mediarecorder/cancel": "İptal", + "mediarecorder/click-flag": "Bekleniyor...", + "mediarecorder/click-flag-description": "Kayda başlamak için yeşil bayrağa tıkla. Durdurmak için bu butona tıkla.", + "mediarecorder/option-title": "Kayıt Seçenekleri", + "mediarecorder/record": "Kayıt", + "mediarecorder/record-after-flag": "Yeşil Bayrağa tıklanana kadar kayda başlama", + "mediarecorder/record-audio": "Proje seslerini de kaydet", + "mediarecorder/record-audio-description": "Bu, Metinden Sese tekniğini desteklemez.", + "mediarecorder/record-description": "Sahneyi bir WebM dosyası olarak kaydedin. Kayıt bittikten sonra bilgisayarınıza kaydedebilirsiniz.\nNot: değişken ve liste ekranları görünmeyecek.", + "mediarecorder/record-duration": "Kayıt Süresi (saniye ile)", + "mediarecorder/record-mic": "Mikrofondaki sesleri de kaydet", + "mediarecorder/record-until-stop": "Proje durduğunda kaydı durdur", + "mediarecorder/record-until-stop-disabled": "Bunu kullanmak için \"{afterFlagOption}\" seçeneğini etkinleştirmeniz gerekiyor.", + "mediarecorder/start": "Başla", + "mediarecorder/start-delay": "Gecikmeyi Başlat (saniye ile)", + "mediarecorder/starting-in": "{secs} saniyede başlıyor...", + "mediarecorder/stop": "Kaydı Durdur", + "debugger/block-breakpoint": "durdurucu", + "debugger/block-error": "hata %s", + "debugger/block-log": "günlük %s", + "debugger/block-warn": "uyarı %s", + "debugger/cannot-pause-player": "Durdurucu bloğu yalnızca düzenleyicideyken kullanılabilir.", + "debugger/clear": "Temizle", + "debugger/clone-of": "{sprite} kuklasının ikizi", + "debugger/close": "Kapat", + "debugger/console": "Günlükler", + "debugger/debug": "Hata Ayıklama", + "debugger/empty-string": "(boş dize)", + "debugger/enter-format": "Dışa aktarma formatını girin:", + "debugger/export": "Dışa Aktar", + "debugger/export-desc": "Dışa aktarma formatını özelleştirmek için Shift tuşunu basılı tutarken tıklayın.", + "debugger/icon-error": "Hata", + "debugger/icon-warn": "Uyarı", + "debugger/log-msg-broadcasted": "'{broadcast}' haberi salındı.", + "debugger/log-msg-clone-cap": "'{sprite}' kuklasının ikizi oluşturulamadı, bir projede 300'den fazla ikiz oluşturulamaz.", + "debugger/log-msg-clone-created": "'{sprite}' kuklasının ikizi oluşturuldu.", + "debugger/log-msg-flag-clicked": "Yeşil bayrağa tıklandı.", + "debugger/no-logs": "Görüntülenecek günlük yok.", + "debugger/no-threads-running": "Çalışan blok dizesi yok.", + "debugger/step": "Adım", + "debugger/step-desc": "Bir bloğu çalıştırır.", + "debugger/tab-logs": "Günlükler", + "debugger/tab-threads": "Blok Dizeleri", + "debugger/thread": "{id} numaralı blok dizesi", + "debugger/unknown-sprite": "(bilinmeyen kukla)", + "debugger/unpause": "Devam Et", + "pause/pause": "Duraklat", + "clones/clones": "ikiz sayısı: {cloneCount}", + "color-picker/hex": "hex rengi", + "remove-sprite-confirm/confirm": "Kuklayı silmek istediğinizden emin misiniz?", + "block-count/blocks": "{num, plural, one {1 blok} other {# blok}}", + "onion-skinning/behind": "Arka", + "onion-skinning/front": "Ön", + "onion-skinning/layering": "Katmanla", + "onion-skinning/merge": "Birleştir", + "onion-skinning/mode": "Mod", + "onion-skinning/next": "Sonraki kostümler", + "onion-skinning/opacity": "Saydamlık (%)", + "onion-skinning/opacityStep": "Saydamlık derecesi (%)", + "onion-skinning/previous": "Önceki kostümler", + "onion-skinning/settings": "Önceki Kostümün İzi Ayarları", + "onion-skinning/tint": "Ton", + "onion-skinning/toggle": "Önceki Kostümün İzini Oluşturmayı Aç/Kapat", + "paint-snap/boxCenter": "Seçimin merkezinden", + "paint-snap/boxCorners": "Seçimin köşelerinden", + "paint-snap/boxEdgeMids": "Seçimin orta kenar noktalarından", + "paint-snap/objectCenters": "Nesnelerin merkezlerine", + "paint-snap/objectCorners": "Nesnelerin köşelerine", + "paint-snap/objectEdges": "Nesnelerin kenarlarına", + "paint-snap/objectMidlines": "Nesnelerin orta hatlarına", + "paint-snap/off": "Kapalı", + "paint-snap/on": "Açık", + "paint-snap/pageAxes": "Sayfanın x ve y eksenlerine", + "paint-snap/pageCenter": "Sayfanın merkezine", + "paint-snap/pageCorners": "Sayfanın köşelerine", + "paint-snap/pageEdges": "Sayfanın kenarlarına", + "paint-snap/settings": "Tutturma Ayarları", + "paint-snap/snapFrom": "Şuradan tuttur:", + "paint-snap/snapTo": "Şuraya tuttur:", + "paint-snap/threshold": "Tutturma mesafesi", + "paint-snap/toggle": "Tutturmayı Değiştir", + "2d-color-picker/shade": "Ton", + "better-img-uploads/upload": "HD Yükle", + "variable-manager/for-all-sprites": "Tüm kuklaların değişkenleri", + "variable-manager/for-this-sprite": "Bu kuklanın değişkenleri", + "variable-manager/search": "Ara", + "variable-manager/too-big": "Çok büyük değeri görmek için tıkla.", + "variable-manager/variables": "Değişkenler", + "search-sprites/placeholder": "Kuklalarda ara...", + "sprite-properties/close-properties-panel-tooltip": "Özellikler panelini daralt", + "sprite-properties/open-properties-panel-tooltip": "Özellikler panelini aç", + "gamepad/axes-a-b": "{a} ve {b} eksenleri", + "gamepad/axis-arrows": "Ok Tuşları", + "gamepad/axis-cursor": "İmleç", + "gamepad/axis-custom": "Özel", + "gamepad/axis-none": "Yok", + "gamepad/browser-support": "Bu tarayıcı ve işletim sistemi, bu eklentinin kullanımını zorlaştırabilecek bilinen hatalara sahip. Herhangi bir sorunla karşılaşırsanız başka bir tarayıcı deneyin.", + "gamepad/button-n": "Buton {n}", + "gamepad/clear": "Tüm kontrolleri temizle", + "gamepad/config-header": "Bu yorum, https://turbowarp.org/ gibi üçüncü taraf araçlarda veya sitelerde oyun kumandası desteği için yapılandırma içerir\nEl ile düzenleme yapmayın", + "gamepad/key-click": "Tıkla", + "gamepad/key-down": "Aşağı", + "gamepad/key-left": "Sol", + "gamepad/key-none": "(yok)", + "gamepad/key-right": "Sağ", + "gamepad/key-space": "Boşluk", + "gamepad/key-up": "Yukarı", + "gamepad/keyinput-title": "Tıkla ve herhangi bir tuşa bas veya değiştirme butonuna tıkla. İptal etmek için escape tuşunu, temizlemek için backspace veya delete tuşunu kullan.", + "gamepad/no-controllers": "Hiçbir denetleyici algılanmadı. Cihazı bir girişe takıp üzerindeki bir düğmeye basmayı deneyin.", + "gamepad/reset": "Tüm kontrolleri projenin varsayılan ayarlarına sıfırla", + "gamepad/settings": "Oyun Kumandası Ayarları", + "gamepad/store-in-project": "Varsayılan yapılandırmayı geçersiz kılmak için bu ayarları projede saklayın (Proje yaratıcıları için deneysel araç)", + "folders/add-to-folder": "{folder} klasörüne ekle", + "folders/closed-folder": "Klasör", + "folders/confirm-backpack-folder": "Tüm klasör sırt çantasına kaydedilsin mi?", + "folders/create-folder": "klasör oluştur", + "folders/name-not-allowed": "Geçersiz klasör adı", + "folders/name-prompt": "Klasörün adı:", + "folders/name-prompt-title": "Klasör Oluştur", + "folders/open-folder": "Açıldı", + "folders/remove-folder": "klasörü sil", + "folders/remove-from-folder": "klasörden sil", + "folders/rename-folder": "klasörü yeniden adlandır", + "folders/rename-folder-prompt": "Klasörün adını şununla değiştir: ", + "folders/rename-folder-prompt-title": "Klasörü Yeniden Adlandır", + "block-switching/control_forever": "sürekli", + "block-switching/control_if": "eğer ise", + "block-switching/control_if_else": "eğer ise... değilse", + "block-switching/control_repeat_until": "olana kadar tekrarla", + "block-switching/control_wait_until": "olana kadar bekle", + "block-switching/data_changevariableby": "değişkeni değiştir", + "block-switching/data_hidelist": "listeyi gizle", + "block-switching/data_hidevariable": "değişkeni gizle", + "block-switching/data_insertatlist": "öge ekle", + "block-switching/data_replaceitemoflist": "ögeyi değiştir", + "block-switching/data_setvariableto": "değişkeni ayarla", + "block-switching/data_showlist": "listeyi göster", + "block-switching/data_showvariable": "değişkeni göster", + "block-switching/debugger_error": "hata", + "block-switching/debugger_log": "günlük", + "block-switching/debugger_warn": "uyarı", + "block-switching/event_broadcast": "haberi sal", + "block-switching/event_broadcastandwait": "haberi sal ve bekle", + "block-switching/looks_backdropnumbername": "zemin numarası veya adı", + "block-switching/looks_changeeffectby": "efekti değiştir", + "block-switching/looks_changesizeby": "boyutu değiştir", + "block-switching/looks_costumenumbername": "kostüm numarası veya adı", + "block-switching/looks_hide": "gizle", + "block-switching/looks_nextbackdrop": "sonraki dekor", + "block-switching/looks_nextcostume": "sonraki kostüm", + "block-switching/looks_say": "de", + "block-switching/looks_sayforsecs": "saniyeler için söyle", + "block-switching/looks_seteffectto": "efekti ayarla", + "block-switching/looks_setsizeto": "boyutu ayarla", + "block-switching/looks_show": "göster", + "block-switching/looks_switchbackdropto": "zemini değiştir", + "block-switching/looks_switchbackdroptoandwait": "zemini değiştir ve bekle", + "block-switching/looks_think": "düşün", + "block-switching/looks_thinkforsecs": "saniyeler için düşün", + "block-switching/motion_changexby": "x'i değiştir", + "block-switching/motion_changeyby": "y'yi değiştir", + "block-switching/motion_setx": "x'i yap", + "block-switching/motion_sety": "y'yi yap", + "block-switching/motion_turnleft": "sola dön", + "block-switching/motion_turnright": "sağa dön", + "block-switching/motion_xposition": "x konumu", + "block-switching/motion_yposition": "y konumu", + "block-switching/music_changeTempo": "tempoyu değiştir", + "block-switching/music_setTempo": "tempoyu ayarla", + "block-switching/operator_and": "ve", + "block-switching/operator_or": "veya", + "block-switching/pen_changePenColorParamBy": "parametreyi değiştir", + "block-switching/pen_changePenHueBy": "rengi değiştir", + "block-switching/pen_changePenShadeBy": "gölgeyi değiştir", + "block-switching/pen_changePenSizeBy": "boyutu değiştir", + "block-switching/pen_penDown": "kalemi bastır", + "block-switching/pen_penUp": "kalemi kaldır", + "block-switching/pen_setPenColorParamTo": "parametreyi ayarla", + "block-switching/pen_setPenHueToNumber": "rengi ayarla", + "block-switching/pen_setPenShadeToNumber": "gölgeyi ayarla", + "block-switching/pen_setPenSizeTo": "boyutu ayarla", + "block-switching/sensing_mousex": "farenin x'i", + "block-switching/sensing_mousey": "farenin y'si", + "block-switching/sound_changeeffectby": "efekti değiştir", + "block-switching/sound_changevolumeby": "sesi değiştir", + "block-switching/sound_play": "başlat", + "block-switching/sound_playuntildone": "bitene kadar çal", + "block-switching/sound_seteffectto": "efekti ayarla", + "block-switching/sound_setvolumeto": "sesi ayarla", + "blocks2image/error_blocks_not_added": "Çalışma alanına blok ekleyin!", + "blocks2image/export_all_to_PNG": "Her şeyi PNG olarak dışa aktar", + "blocks2image/export_all_to_SVG": "Her şeyi SVG olarak dışa aktar", + "blocks2image/export_selected_to_PNG": "Bloğu PNG olarak dışa aktar", + "blocks2image/export_selected_to_SVG": "Bloğu SVG olarak dışa aktar", + "move-to-top-bottom/bottom": "en alta taşı", + "move-to-top-bottom/top": "en üste taşı", + "swap-local-global/cant-convert-cloud": "Bulut değişkenleri, yalnızca bu kukla için ayarına dönüştürülemez.", + "swap-local-global/cant-convert-conflict": "{sprites}, başka bir kukladaki değişkenlerle çakışacağı için dönüştürülemiyor.", + "swap-local-global/cant-convert-stage": "Dekor alanı, yalnızca bu kukla için değişkenine sahip olamaz.", + "swap-local-global/cant-convert-to-local": "{sprites}, birden fazla kukla tarafından kullanılmakta oldupu için dönüştürülemiyor.", + "swap-local-global/cant-convert-used-elsewhere": "Başka bir kukla tarafından kullanıldığı için dönüştürülemiyor: {sprite}", + "swap-local-global/edit": "Özellikleri düzenle:", + "swap-local-global/edit-list-header": "Listeyi düzenle", + "swap-local-global/edit-list-option": "Listeyi yeniden adlandır veya düzenle", + "swap-local-global/edit-variable-header": "Değişkeni düzenle", + "swap-local-global/edit-variable-option": "Değişkeni yeniden adlandır veya düzenle", + "swap-local-global/to-global": "\"Tüm kuklalar için\" ayarına dönüştür", + "swap-local-global/to-local": "\"Yalnızca bu kukla için” ayarına dönüştür", + "hide-stage/hide-stage": "Sahneyi gizle" +} \ No newline at end of file diff --git a/src/addons/addons-l10n/zh-tw.json b/src/addons/addons-l10n/zh-tw.json new file mode 100644 index 0000000000000000000000000000000000000000..87d1e2f9724e2e8c5f67c0b8fd353798b60a77e8 --- /dev/null +++ b/src/addons/addons-l10n/zh-tw.json @@ -0,0 +1,222 @@ +{ + "editor-devtools/clean-plus": "整理積木 +", + "editor-devtools/copy-all": "複製全部", + "editor-devtools/copy-block": "複製積木", + "editor-devtools/cut-block": "剪下積木", + "editor-devtools/lists": "清單", + "editor-devtools/make-space": "騰出空間", + "editor-devtools/orphaned": "{count, plural, other {要刪除 # 個單獨存在的積木嗎?} }", + "editor-devtools/paste": "貼上", + "editor-devtools/replace": "將這個角色上的變數 {name} 全部替換成:", + "editor-devtools/swap": "替換角色中的所有{var}", + "editor-devtools/unused-list": "{count, plural, other {要刪除 # 個沒有用到的清單嗎?這些清單包含:\n} }", + "editor-devtools/unused-var": "{count, plural, other {要刪除 # 個沒有用到的變數嗎?這些變數包含:\n} }", + "editor-devtools/var-not-exist": "這個變數不存在…", + "editor-devtools/variables": "變數", + "find-bar/find-placeholder": "查找 (Ctrl+F)", + "middle-click-popup/start-typing": "開始打字...", + "editor-searchable-dropdowns/createBroadcast": "建立廣播訊息 {name}", + "editor-searchable-dropdowns/createGlobalList": "建立全域清單 {name}", + "editor-searchable-dropdowns/createGlobalVariable": "建立全域變數 {name} ", + "editor-searchable-dropdowns/createLocalList": "建立區域清單 {name}", + "editor-searchable-dropdowns/createLocalVariable": "建立區域變數 {name}", + "data-category-tweaks-v2/for-all-sprites": "適用於所有角色:", + "data-category-tweaks-v2/for-this-sprite-only": "僅適用於當前角色:", + "data-category-tweaks-v2/list-category": "清單", + "hide-flyout/lock": "固定工具箱", + "hide-flyout/unlock": "取消固定工具箱", + "mediarecorder/cancel": "取消", + "mediarecorder/click-flag": "正在等待…", + "mediarecorder/click-flag-description": "點擊綠旗就會開始錄製,點擊這個按鈕可以停止。", + "mediarecorder/option-title": "錄製設定", + "mediarecorder/record-after-flag": "在綠旗被點擊時才開始錄製", + "mediarecorder/record-audio": "包含專案的聲音", + "mediarecorder/record-audio-description": "這不包括文字轉語音的聲音。", + "mediarecorder/record-duration": "錄製時長(秒)", + "mediarecorder/record-mic": "包含來自麥克風的聲音", + "mediarecorder/record-until-stop": "在停止專案運行時也停止錄製", + "mediarecorder/record-until-stop-disabled": "你必須啟用「{afterFlagOption}」才可以設定這個項目。", + "mediarecorder/start": "開始", + "mediarecorder/start-delay": "開始時延遲(秒)", + "mediarecorder/starting-in": "錄影倒數 {secs}...", + "mediarecorder/stop": "停止錄影", + "debugger/block-breakpoint": "中斷點", + "debugger/block-error": "錯誤 %s", + "debugger/block-log": "記錄 %s", + "debugger/block-warn": "警告 %s", + "debugger/cannot-pause-player": "中斷點積木只能在編輯器中使用。", + "debugger/clear": "清除", + "debugger/clone-of": "{sprite}的分身", + "debugger/close": "關閉", + "debugger/console": "紀錄", + "debugger/debug": "偵錯", + "debugger/empty-string": "(空字串)", + "debugger/enter-format": "輸入匯出格式:", + "debugger/export": "匯出", + "debugger/export-desc": "按住 Shift 鍵並點擊以自訂匯出格式", + "debugger/icon-error": "錯誤", + "debugger/icon-warn": "警告", + "debugger/log-msg-broadcasted": "廣播了訊息{broadcast}", + "debugger/log-msg-clone-cap": "創建{sprite}的分身時失敗,分身的創建不能超過 300 個。", + "debugger/log-msg-clone-created": "建立了{sprite}的分身。", + "debugger/log-msg-flag-clicked": "綠旗被點擊。", + "debugger/no-logs": "沒有可顯示的紀錄。", + "debugger/no-threads-running": "沒有運行中的執行緒。", + "debugger/step": "步進", + "debugger/step-desc": "執行一個積木", + "debugger/tab-logs": "紀錄", + "debugger/tab-threads": "執行緒", + "debugger/thread": "執行緒 {id}", + "debugger/unknown-sprite": "(未知角色)", + "debugger/unpause": "繼續", + "pause/pause": "暫停", + "clones/clones": "分身數:{cloneCount}", + "color-picker/hex": "hex 色碼", + "remove-sprite-confirm/confirm": "確定要刪除這個角色?", + "block-count/blocks": "{num, plural, other {# 個程式積木}}", + "onion-skinning/behind": "在後面", + "onion-skinning/front": "在前面", + "onion-skinning/layering": "圖層排列", + "onion-skinning/merge": "合併", + "onion-skinning/mode": "顯示模式", + "onion-skinning/next": "下一個造型", + "onion-skinning/opacity": "透明度(%)", + "onion-skinning/opacityStep": "透明漸進(%)", + "onion-skinning/previous": "上一個造型", + "onion-skinning/settings": "描圖紙設定", + "onion-skinning/tint": "染色", + "onion-skinning/toggle": "描圖紙顯示切換", + "paint-snap/off": "關", + "paint-snap/on": "開", + "2d-color-picker/shade": "陰影", + "better-img-uploads/upload": "高清圖片上傳", + "variable-manager/for-all-sprites": "所有角色使用的變數", + "variable-manager/for-this-sprite": "僅這個角色使用的變數", + "variable-manager/search": "搜尋", + "variable-manager/variables": "變數", + "search-sprites/placeholder": "搜尋角色…", + "gamepad/axes-a-b": "軸 {a} 與 {b}", + "gamepad/axis-arrows": "方向鍵", + "gamepad/axis-cursor": "滑鼠游標", + "gamepad/axis-custom": "自訂", + "gamepad/axis-none": "無", + "gamepad/browser-support": "這個瀏覽器和操作系統有些已知錯誤,可能使這個插件難以使用,如果你碰到了一些問題,請試試其它的瀏覽器。", + "gamepad/button-n": "按鈕 {n}", + "gamepad/clear": "清空所有控制設置", + "gamepad/config-header": "這個註解包含第三方工具或網站(如 https://turbowarp.org/)中的遊戲手柄配置。\n請勿手動修改", + "gamepad/key-click": "點擊", + "gamepad/key-down": "向下鍵", + "gamepad/key-enter": "Enter 鍵", + "gamepad/key-left": "向左鍵", + "gamepad/key-none": "(無)", + "gamepad/key-right": "向右鍵", + "gamepad/key-space": "空白鍵", + "gamepad/key-up": "向上鍵", + "gamepad/keyinput-title": "點擊並按下一個鍵或單擊更改按鈕。ESC 鍵可取消。返回鍵或 Delete 鍵可刪除。", + "gamepad/no-controllers": "未檢測到遊戲手柄,請在連接後再按一次按鈕。", + "gamepad/reset": "重設所有控制設置到專案預設值", + "gamepad/settings": "遊戲手柄設置", + "gamepad/store-in-project": "將這些設置儲存在專案裡以覆寫原來的設定(項目創建者的實驗工具)", + "folders/add-to-folder": "放進資料夾:{folder}", + "folders/closed-folder": "資料夾", + "folders/confirm-backpack-folder": "將整個資料夾放進背包?", + "folders/create-folder": "創建資料夾", + "folders/name-not-allowed": "無效的資料夾名稱", + "folders/name-prompt": "資料夾名稱:", + "folders/name-prompt-title": "創建資料夾", + "folders/open-folder": "已開啟", + "folders/remove-folder": "移除資料夾", + "folders/remove-from-folder": "移出資料夾", + "folders/rename-folder": "更名資料夾", + "folders/rename-folder-prompt": "將資料夾重新命名為:", + "folders/rename-folder-prompt-title": "重新命名資料夾", + "block-switching/control_forever": "重複無限次", + "block-switching/control_if": "如果", + "block-switching/control_if_else": "如果…否則", + "block-switching/control_repeat_until": "等待直到", + "block-switching/control_wait_until": "等待直到", + "block-switching/data_changevariableby": "變數改變", + "block-switching/data_hidelist": "清單隱藏", + "block-switching/data_hidevariable": "變數隱藏", + "block-switching/data_insertatlist": "插入項目", + "block-switching/data_replaceitemoflist": "替換項目", + "block-switching/data_setvariableto": "變數設為", + "block-switching/data_showlist": "清單顯示", + "block-switching/data_showvariable": "變數顯示", + "block-switching/debugger_error": "錯誤", + "block-switching/debugger_log": "紀錄", + "block-switching/debugger_warn": "警告", + "block-switching/event_broadcast": "廣播訊息", + "block-switching/event_broadcastandwait": "廣播訊息並等待", + "block-switching/looks_backdropnumbername": "背景編號或名稱", + "block-switching/looks_changeeffectby": "圖像效果改變", + "block-switching/looks_changesizeby": "尺寸改變", + "block-switching/looks_costumenumbername": "造型編號或名稱", + "block-switching/looks_hide": "隱藏", + "block-switching/looks_nextbackdrop": "背景換成下一個", + "block-switching/looks_nextcostume": "造型換成下一個", + "block-switching/looks_say": "說出", + "block-switching/looks_sayforsecs": "說出持續", + "block-switching/looks_seteffectto": "圖像效果設為", + "block-switching/looks_setsizeto": "尺寸設為", + "block-switching/looks_show": "顯示", + "block-switching/looks_switchbackdropto": "背景換成", + "block-switching/looks_switchbackdroptoandwait": "背景換成並等待", + "block-switching/looks_think": "想著", + "block-switching/looks_thinkforsecs": "想著持續", + "block-switching/motion_changexby": "x 改變", + "block-switching/motion_changeyby": "y 改變", + "block-switching/motion_setx": "x 設為", + "block-switching/motion_sety": "y 設為", + "block-switching/motion_turnleft": "左轉", + "block-switching/motion_turnright": "右轉", + "block-switching/motion_xposition": "x 座標", + "block-switching/motion_yposition": "y 座標", + "block-switching/music_changeTempo": "演奏速度改變", + "block-switching/music_setTempo": "演奏速度設為", + "block-switching/operator_and": "且", + "block-switching/operator_mod": "取餘數", + "block-switching/operator_or": "或", + "block-switching/pen_changePenColorParamBy": "參數改變", + "block-switching/pen_changePenHueBy": "顏色改變", + "block-switching/pen_changePenShadeBy": "陰影改變", + "block-switching/pen_changePenSizeBy": "筆跡寬度改變", + "block-switching/pen_penDown": "下筆", + "block-switching/pen_penUp": "停筆", + "block-switching/pen_setPenColorParamTo": "參數設為", + "block-switching/pen_setPenHueToNumber": "顏色設為", + "block-switching/pen_setPenShadeToNumber": "陰影設為", + "block-switching/pen_setPenSizeTo": "筆跡寬度設為", + "block-switching/sensing_mousex": "鼠標的 x", + "block-switching/sensing_mousey": "鼠標的 y", + "block-switching/sound_changeeffectby": "聲音效果改變", + "block-switching/sound_changevolumeby": "音量改變", + "block-switching/sound_play": "播放音效", + "block-switching/sound_playuntildone": "播放音效直到結束", + "block-switching/sound_seteffectto": "聲音效果設為", + "block-switching/sound_setvolumeto": "音量設為", + "blocks2image/error_blocks_not_added": "添加積木到編輯區!", + "blocks2image/export_all_to_PNG": "匯出全部積木成 PNG 圖像", + "blocks2image/export_all_to_SVG": "匯出全部積木成 SVG 圖像", + "blocks2image/export_selected_to_PNG": "匯出積木成 PNG 圖像", + "blocks2image/export_selected_to_SVG": "匯出積木成 SVG 圖像", + "editor-extra-keys/enter-key": "Enter", + "move-to-top-bottom/bottom": "移至最下面", + "move-to-top-bottom/top": "移至最上面", + "rename-broadcasts/RENAME_BROADCAST": "重新命名訊息", + "rename-broadcasts/RENAME_BROADCAST_MODAL_TITLE": "重新命名訊息", + "rename-broadcasts/RENAME_BROADCAST_TITLE": "將所有“{name}”消息重命名為:", + "swap-local-global/cant-convert-cloud": "無法轉換,雲端變數不能被轉換成「僅適用當前角色」。", + "swap-local-global/cant-convert-conflict": "無法轉換,因為會和其它角色中相同名稱的變數衝突:{sprites}", + "swap-local-global/cant-convert-stage": "舞台不能有「僅適用當前角色」的變數。", + "swap-local-global/cant-convert-to-local": "無法轉換,因為有其它角色也在使用這個變數:{sprites}", + "swap-local-global/cant-convert-used-elsewhere": "無法轉換,因為有另一個角色也在使用這個變數:{sprite}", + "swap-local-global/edit": "編輯屬性:", + "swap-local-global/edit-list-header": "編輯清單", + "swap-local-global/edit-list-option": "編輯清單", + "swap-local-global/edit-variable-header": "編輯變數", + "swap-local-global/edit-variable-option": "編輯變數", + "swap-local-global/to-global": "轉換成「適用於所有角色」", + "swap-local-global/to-local": "轉換成「僅適用當前角色」", + "hide-stage/hide-stage": "隱藏舞台" +} \ No newline at end of file diff --git a/src/addons/addons.js b/src/addons/addons.js new file mode 100644 index 0000000000000000000000000000000000000000..cbb59dfd6ea54bfe8d29f3c789e443094787416b --- /dev/null +++ b/src/addons/addons.js @@ -0,0 +1,94 @@ +// This file is only used by pull.js to generate files. It is not used at runtime. + +const addons = [ + 'fps', + 'debug-console', + 'ScratchHighlightFullwidthNumber', + 'cat-blocks', + 'editor-devtools', + 'find-bar', + 'middle-click-popup', + 'jump-to-def', + 'editor-searchable-dropdowns', + 'block-palette-icons', + 'hide-flyout', + 'mediarecorder', + 'drag-drop', + 'debugger', + 'pause', + 'mute-project', + 'vol-slider', + 'clones', + 'mouse-pos', + 'color-picker', + 'remove-sprite-confirm', + 'block-count', + 'onion-skinning', + 'paint-snap', + 'default-costume-editor-color', + 'bitmap-copy', + '2d-color-picker', + 'better-img-uploads', + 'pick-colors-from-stage', + 'custom-block-shape', + 'zebra-striping', + 'editor-theme3', + 'custom-block-text', + 'editor-colored-context-menus', + 'editor-stage-left', + 'editor-buttons-reverse-order', + 'variable-manager', + 'search-sprites', + 'sprite-properties', + 'gamepad', + 'editor-sounds', + 'folders', + 'block-switching', + 'load-extensions', + 'custom-zoom', + 'initialise-sprite-position', + 'blocks2image', + 'remove-curved-stage-border', + 'transparent-orphans', + 'paint-by-default', + 'block-cherry-picking', + 'hide-new-variables', + 'editor-extra-keys', + 'hide-delete-button', + 'no-script-bumping', + 'disable-stage-drag-select', + 'move-to-top-bottom', + 'disable-paste-offset', + 'block-duplicate', + 'swap-local-global', + 'editor-comment-previews', + 'columns', + 'number-pad', + 'script-snap', + 'fullscreen', + 'hide-stage', + 'tw-straighten-comments', + 'tw-remove-backpack', + 'tw-remove-feedback', + 'tw-disable-cloud-variables', + 'vol-slider', + 'number-pad', + 'rename-broadcasts', + 'sprite-properties', + 'paint-snap', + "editor-block-chomping" +]; + +const newAddons = [ + "paint-gradient-maker", + "paint-tool-panel", + "toolbox-full-blocks-on-hover", + "waveform-chunk-size", + "paint-rounded-rect-seperate", + "paint-default-smoothing" +]; +// eslint-disable-next-line import/no-commonjs +module.exports = { + addons, + newAddons +}; diff --git a/src/addons/addons/2d-color-picker/_manifest_entry.js b/src/addons/addons/2d-color-picker/_manifest_entry.js new file mode 100644 index 0000000000000000000000000000000000000000..28041bcea631bfe64fe68cbe72299dcca5129052 --- /dev/null +++ b/src/addons/addons/2d-color-picker/_manifest_entry.js @@ -0,0 +1,24 @@ +/* generated by pull.js */ +const manifest = { + "editorOnly": true, + "name": "2D color picker", + "description": "Replaces saturation and brightness sliders in the costume editor with a 2D color picker. Hold Shift while dragging the cursor to change the values on a single axis.", + "tags": [], + "credits": [ + { + "name": "Ucrash" + } + ], + "userscripts": [ + { + "url": "userscript.js" + } + ], + "userstyles": [ + { + "url": "style.css" + } + ], + "enabledByDefault": false +}; +export default manifest; diff --git a/src/addons/addons/2d-color-picker/_runtime_entry.js b/src/addons/addons/2d-color-picker/_runtime_entry.js new file mode 100644 index 0000000000000000000000000000000000000000..1639fc18008f76f7f051c35a526d60cfd983598a --- /dev/null +++ b/src/addons/addons/2d-color-picker/_runtime_entry.js @@ -0,0 +1,9 @@ +/* generated by pull.js */ +import _js from "./userscript.js"; +import _css from "!css-loader!./style.css"; +import _asset from "!url-loader!./assets/sv-gr.png"; +export const resources = { + "userscript.js": _js, + "style.css": _css, + "assets/sv-gr.png": _asset, +}; diff --git a/src/addons/addons/2d-color-picker/assets/sv-gr.png b/src/addons/addons/2d-color-picker/assets/sv-gr.png new file mode 100644 index 0000000000000000000000000000000000000000..595c60b80ed860a0eb63970bf6a222787159f361 Binary files /dev/null and b/src/addons/addons/2d-color-picker/assets/sv-gr.png differ diff --git a/src/addons/addons/2d-color-picker/paint-editor.js b/src/addons/addons/2d-color-picker/paint-editor.js new file mode 100644 index 0000000000000000000000000000000000000000..2c638467c9e59bc477b44e3fecd7faf1e98e2283 --- /dev/null +++ b/src/addons/addons/2d-color-picker/paint-editor.js @@ -0,0 +1,254 @@ +// this script was happily stolen from the color-picker addon, developed by Richie Bendall and apple502j + +// import required libraries +import { normalizeHex } from "../../libraries/common/cs/normalize-color.js"; +import RateLimiter from "../../libraries/common/cs/rate-limiter.js"; +import tinycolor from "../../libraries/thirdparty/cs/tinycolor-min.js"; + +export default async ({ addon, console, msg }) => { + let prevEventHandler; + // 250-ms rate limit + const rateLimiter = new RateLimiter(250); + + // get the color from scratch + const getColor = (element) => { + let fillOrStroke; + const state = addon.tab.redux.state; + if (state.scratchPaint.modals.fillColor) { + fillOrStroke = "fill"; + } else if (state.scratchPaint.modals.strokeColor) { + fillOrStroke = "stroke"; + } else { + return; + } + const colorType = state.scratchPaint.fillMode.colorIndex; + const primaryOrSecondary = ["primary", "secondary"][colorType]; + const color = state.scratchPaint.color[`${fillOrStroke}Color`][primaryOrSecondary]; + if (color === null || color === "scratch-paint/style-path/mixed") return; + // This value can be arbitrary - it can be HEX, RGB, etc. + // Use tinycolor to convert them. + return tinycolor(color).toHex8(); + }; + + // load the new color to scratch + const setColor = (hex, element) => { + hex = normalizeHex(hex); + if (!addon.tab.redux.state || !addon.tab.redux.state.scratchPaint) return; + // The only way to reliably set color is to invoke eye dropper via click() + // then faking that the eye dropper reported the value. + const onEyeDropperOpened = ({ detail }) => { + if (detail.action.type !== "scratch-paint/eye-dropper/ACTIVATE_COLOR_PICKER") return; + addon.tab.redux.removeEventListener("statechanged", onEyeDropperOpened); + setTimeout(() => { + const previousTool = addon.tab.redux.state.scratchPaint.color.eyeDropper.previousTool; + if (previousTool) previousTool.activate(); + addon.tab.redux.state.scratchPaint.color.eyeDropper.callback(hex); + addon.tab.redux.dispatch({ + type: "scratch-paint/eye-dropper/DEACTIVATE_COLOR_PICKER", + }); + }, 50); + }; + addon.tab.redux.addEventListener("statechanged", onEyeDropperOpened); + element.children[1].children[0].click(); + }; + + // for the color picker's background color + const convertToGeneralColor = (hex) => { + let h = tinycolor(hex).toHsv(); + h.s = 1; + h.v = 1; + return tinycolor(h).toHex(); + }; + + // le loop + while (true) { + // wait for color dialog box appearance + const element = await addon.tab.waitForElement('div[class*="color-picker_swatch-row"]', { + markAsSeen: true, + reduxCondition: (state) => state.scratchGui.editorTab.activeTabIndex === 1 && !state.scratchGui.mode.isPlayerOnly, + }); + rateLimiter.abort(false); + if (!("colorIndex" in addon.tab.redux.state.scratchPaint.fillMode)) { + console.error("Detected new paint editor; this will be supported in future versions."); + return; + } + + // update the bg color of the picker + function updateColor() { + rateLimiter.limit(() => { + let c = getColor(element); + let chsv = tinycolor(c).toHsv(); + updateHandleFinal(chsv.s, chsv.v); + saColorPicker.style.background = "#" + convertToGeneralColor(getColor(element)); + }); + } + + // redux stuff + addon.tab.redux.initialize(); + addon.tab.redux.addEventListener("statechanged", (e) => + e.detail.action.type === "scratch-paint/fill-style/CHANGE_FILL_COLOR" || + e.detail.action.type === "scratch-paint/fill-style/CHANGE_FILL_COLOR_2" || + e.detail.action.type === "scratch-paint/stroke-style/CHANGE_STROKE_COLOR" || + e.detail.action.type === "scratch-paint/stroke-style/CHANGE_STROKE_COLOR_2" + ? updateColor() + : 0 + ); + if (addon.tab.redux && typeof prevEventHandler === "function") { + addon.tab.redux.removeEventListener("statechanged", prevEventHandler); + prevEventHandler = null; + } + + // get the color + if (addon.tab.editorMode !== "editor") continue; + let defaultColor = getColor(element); + + // create the color picker element and all it's child elements + const saColorPicker = document.createElement("div"); + saColorPicker.className = "sa-2dcolor-picker"; + saColorPicker.style.background = "#" + convertToGeneralColor(defaultColor || "ff0000"); + + const saColorPickerImage = Object.assign(document.createElement("img"), { + className: "sa-2dcolor-picker-image", + src: addon.self.getResource("/assets/sv-gr.png") /* rewritten by pull.js */, + draggable: false, + }); + const saColorPickerHandle = Object.assign(document.createElement("div"), { + className: addon.tab.scratchClass("slider_handle"), + }); + saColorPickerHandle.style.pointerEvents = "none"; + + // create the label + const saColorLabel = document.createElement("div"); + saColorLabel.className = addon.tab.scratchClass("color-picker_row-header", { others: "sa-2dcolor-label" }); + const saColorLabelName = document.createElement("span"); + saColorLabelName.className = addon.tab.scratchClass("color-picker_label-name", { others: "sa-2dcolor-label-name" }); + saColorLabelName.innerText = msg("shade"); + const saColorLabelVal = document.createElement("span"); + saColorLabelVal.className = addon.tab.scratchClass("color-picker_label-readout", { + others: "sa-2dcolor-label-val", + }); + saColorLabel.appendChild(saColorLabelName); + saColorLabel.appendChild(saColorLabelVal); + + let keyPressed = -1; + let originalPos = { x: 0, y: 0 }; + window.addEventListener("keydown", (e) => (keyPressed = e.keyCode)); + window.addEventListener("keyup", () => (keyPressed = -1)); + + let origHue = 0; + let el = null; + + let mousemovefunc = function (e) { + updateHandle(e, keyPressed, originalPos); + return false; + }; + + let mouseupfunc = function (e) { + updateFinal(e, keyPressed, originalPos); + }; + + function updateHandle(e, keyPressed, originalPos) { + let cx = Math.min(Math.max(e.clientX - saColorPicker.getBoundingClientRect().x, 0), 150); + let cy = Math.min(Math.max(e.clientY - saColorPicker.getBoundingClientRect().y, 0), 150); + if (keyPressed === 16) { + if (Math.abs(cx - originalPos.x) > Math.abs(cy - originalPos.y)) cy = originalPos.y; + else cx = originalPos.x; + } + saColorPickerHandle.style.left = cx - 8 + "px"; + saColorPickerHandle.style.top = cy - 8 + "px"; + saColorLabelVal.innerText = `${Math.round((cx / 150) * 100)}, ${100 - Math.round((cy / 150) * 100)}`; + + //update color in real-time (i only bothered to do that for solid colors) + if ( + (!addon.tab.redux.state.scratchPaint.fillMode.gradientType || + addon.tab.redux.state.scratchPaint.fillMode.gradientType === "SOLID") && + el + ) { + let c = tinycolor({ h: origHue, s: cx / 150, v: 1 - cy / 150 }).toHex(); + if (c.startsWith("#")) el.style.background = c; + else el.style.background = "#" + c; + } + } + + function updateHandleFinal(s, v) { + saColorPickerHandle.style.left = s * 150 - 8 + "px"; + saColorPickerHandle.style.top = (1 - v) * 150 - 8 + "px"; + saColorLabelVal.innerText = `${Math.round(s * 100)}, ${Math.round(v * 100)}`; + } + + function updateFinal(e, keyPressed, originalPos) { + rateLimiter.limit(() => { + let ox = Math.min(Math.max(e.clientX - saColorPicker.getBoundingClientRect().x, 0), 150); + let oy = Math.min(Math.max(e.clientY - saColorPicker.getBoundingClientRect().y, 0), 150); + if (keyPressed === 16) { + if (Math.abs(ox - originalPos.x) > Math.abs(oy - originalPos.y)) oy = originalPos.y; + else ox = originalPos.x; + } + + let color = tinycolor(getColor(element)).toHsv(); + let s = ox / 150; + let v = 1 - oy / 150; + let newColor = tinycolor({ h: color.h, s: s, v: v, a: color.a }).toHex8(); + setColor(newColor, element); + updateHandleFinal(s, v); + }); + + window.removeEventListener("pointermove", mousemovefunc); + window.removeEventListener("pointerup", mouseupfunc); + } + + if (defaultColor) { + let defaultHexColor = tinycolor(defaultColor).toHsv(); + updateHandleFinal(defaultHexColor.s, defaultHexColor.v); + } else updateHandleFinal(1, 1); + + saColorPicker.addEventListener("pointerdown", (e) => { + e.preventDefault(); + + originalPos = { + x: parseFloat(saColorPickerHandle.style.left) + 8, + y: parseFloat(saColorPickerHandle.style.top) + 8, + }; + + let fillOrStroke; + const state = addon.tab.redux.state; + if (state.scratchPaint.modals.fillColor) { + fillOrStroke = "fill"; + } else if (state.scratchPaint.modals.strokeColor) { + fillOrStroke = "stroke"; + } else { + fillOrStroke = "wh"; + } + + el = null; + if (fillOrStroke === "fill") + el = document.getElementsByClassName(addon.tab.scratchClass("color-button_color-button-swatch"))[0]; + else if (fillOrStroke === "stroke") + el = document.getElementsByClassName(addon.tab.scratchClass("color-button_color-button-swatch"))[1]; + if (el) origHue = tinycolor(el.style.background).toHsv().h; + + updateHandle(e); + + window.addEventListener("pointermove", mousemovefunc); + window.addEventListener("pointerup", mouseupfunc); + }); + prevEventHandler = ({ detail }) => { + if (detail.action.type === "scratch-paint/color-index/CHANGE_COLOR_INDEX") { + setTimeout(() => { + updateColor(); + }, 100); + } + }; + addon.tab.redux.addEventListener("statechanged", prevEventHandler); + saColorPicker.appendChild(saColorPickerImage); + saColorPicker.appendChild(saColorPickerHandle); + + const [colorSlider, saturationSlider, brightnessSlider] = [ + ...element.parentElement.querySelectorAll('[class^="color-picker_row-header"]'), + ].map((i) => i.parentElement); + saturationSlider.style.display = "none"; + brightnessSlider.style.display = "none"; + colorSlider.insertAdjacentElement("afterend", saColorPicker); + colorSlider.insertAdjacentElement("afterend", saColorLabel); + } +}; diff --git a/src/addons/addons/2d-color-picker/style.css b/src/addons/addons/2d-color-picker/style.css new file mode 100644 index 0000000000000000000000000000000000000000..fc7374dcb9b6947ffe2e10636a53adc1d965e44b --- /dev/null +++ b/src/addons/addons/2d-color-picker/style.css @@ -0,0 +1,15 @@ +.sa-2dcolor-picker { + width: 150px; + height: 150px; + border-radius: 8px; + margin: 8px; + position: relative; + user-select: none; +} + +.sa-2dcolor-picker-image { + border-radius: 8px; + width: 150px; + height: 150px; + user-select: none; +} diff --git a/src/addons/addons/2d-color-picker/userscript.js b/src/addons/addons/2d-color-picker/userscript.js new file mode 100644 index 0000000000000000000000000000000000000000..6a2410c9d8d6606e30a0a8928ab87091217f05d4 --- /dev/null +++ b/src/addons/addons/2d-color-picker/userscript.js @@ -0,0 +1,5 @@ +import paintEditorHandler from "./paint-editor.js"; + +export default async (api) => { + paintEditorHandler(api); +}; diff --git a/src/addons/addons/ScratchHighlightFullwidthNumber/_manifest_entry.js b/src/addons/addons/ScratchHighlightFullwidthNumber/_manifest_entry.js new file mode 100644 index 0000000000000000000000000000000000000000..dfcff02646d211c53404c0be3b05f9e9d029abfb --- /dev/null +++ b/src/addons/addons/ScratchHighlightFullwidthNumber/_manifest_entry.js @@ -0,0 +1,21 @@ +/* generated by pull.js */ +const manifest = { + "editorOnly": true, + "name": "全角数字をハイライト", + "description": "エラーの原因となる「0」から「9」の全角数字をハイライトして警告します。", + "credits": [ + { + "name": "champierre", + "link": "https://github.com/champierre" + } + ], + "userscripts": [ + { + "url": "userscript.js" + } + ], + "dynamicDisable": true, + "tags": [], + "enabledByDefault": true +}; +export default manifest; \ No newline at end of file diff --git a/src/addons/addons/ScratchHighlightFullwidthNumber/_runtime_entry.js b/src/addons/addons/ScratchHighlightFullwidthNumber/_runtime_entry.js new file mode 100644 index 0000000000000000000000000000000000000000..d97d5dd636edfbc044b17583cf77cb46f692fe44 --- /dev/null +++ b/src/addons/addons/ScratchHighlightFullwidthNumber/_runtime_entry.js @@ -0,0 +1,5 @@ +/* generated by pull.js */ +import _js from "./userscript.js"; +export const resources = { + "userscript.js": _js +}; \ No newline at end of file diff --git a/src/addons/addons/ScratchHighlightFullwidthNumber/userscript.js b/src/addons/addons/ScratchHighlightFullwidthNumber/userscript.js new file mode 100644 index 0000000000000000000000000000000000000000..5a13adc214b9e3c37665c2b37f552dc71b086084 --- /dev/null +++ b/src/addons/addons/ScratchHighlightFullwidthNumber/userscript.js @@ -0,0 +1,21 @@ +const target = document.querySelectorAll('.blocklyBlockCanvas'); +const regexp = /[0-9]/; + +const observer = new MutationObserver(records => { + document.querySelectorAll('*[data-argument-type~="text"] text, *[data-argument-type~="number"] text').forEach(e => { + if (regexp.test(e.textContent)){ + e.style.fill = 'red'; + } else { + e.style.fill = ''; + } + }); +}); + +target.forEach(e => { + observer.observe(e, { + attributes: true, + characterData: true, + childList: true, + subtree: true + }); +}); \ No newline at end of file diff --git a/src/addons/addons/better-img-uploads/_manifest_entry.js b/src/addons/addons/better-img-uploads/_manifest_entry.js new file mode 100644 index 0000000000000000000000000000000000000000..757da3147f4cd271bbbffa77f492225588e34d30 --- /dev/null +++ b/src/addons/addons/better-img-uploads/_manifest_entry.js @@ -0,0 +1,67 @@ +/* generated by pull.js */ +const manifest = { + "editorOnly": true, + "name": "HD image uploads", + "description": "Adds a new button above the \"upload costume\" button that automatically converts uploaded bitmap images into SVG (vector) images to avoid losing quality.", + "tags": [ + "beta" + ], + "info": [ + { + "type": "notice", + "text": "Avoid using the HD upload button if you plan to edit the image after uploading.", + "id": "notSuitableEdit" + } + ], + "credits": [ + { + "name": "ErrorGamer2000", + "link": "https://scratch.mit.edu/users/ErrorGamer2000/" + }, + { + "name": "GarboMuffin" + }, + { + "name": "World_Languages" + }, + { + "name": "SheepTester", + "link": "https://scratch.mit.edu/users/Sheep_maker/" + } + ], + "dynamicDisable": true, + "userscripts": [ + { + "url": "userscript.js" + } + ], + "userstyles": [ + { + "url": "style.css" + } + ], + "settings": [ + { + "dynamic": true, + "name": "Image sizing", + "id": "fitting", + "type": "select", + "potentialValues": [ + { + "id": "full", + "name": "Original size" + }, + { + "id": "fill", + "name": "Stretch to fill stage" + }, + { + "id": "fit", + "name": "Shrink to fit stage" + } + ], + "default": "fit" + } + ] +}; +export default manifest; diff --git a/src/addons/addons/better-img-uploads/_runtime_entry.js b/src/addons/addons/better-img-uploads/_runtime_entry.js new file mode 100644 index 0000000000000000000000000000000000000000..0642301b6200608a2da678f162f27daece570555 --- /dev/null +++ b/src/addons/addons/better-img-uploads/_runtime_entry.js @@ -0,0 +1,9 @@ +/* generated by pull.js */ +import _js from "./userscript.js"; +import _css from "!css-loader!./style.css"; +import _asset from "!url-loader!./icon.svg"; +export const resources = { + "userscript.js": _js, + "style.css": _css, + "icon.svg": _asset, +}; diff --git a/src/addons/addons/better-img-uploads/icon.svg b/src/addons/addons/better-img-uploads/icon.svg new file mode 100644 index 0000000000000000000000000000000000000000..93b85f2c433f08ae24305aeefc78b40bb68574ae Binary files /dev/null and b/src/addons/addons/better-img-uploads/icon.svg differ diff --git a/src/addons/addons/better-img-uploads/style.css b/src/addons/addons/better-img-uploads/style.css new file mode 100644 index 0000000000000000000000000000000000000000..1f4bfb5b2057296ead9844e2fc5672ffb8595ad1 --- /dev/null +++ b/src/addons/addons/better-img-uploads/style.css @@ -0,0 +1,12 @@ +[data-for*="HD Upload"]:hover + .__react_component_tooltip { + visibility: visible; +} + +.sa-better-img-uploads-btn:not([id*="_right"]) + .__react_component_tooltip { + left: auto; +} + +.sa-better-img-uploads-btn[id*="_right"] + .__react_component_tooltip, +[data-for="sa-Choose_a_Backdrop-HD Upload"] + .__react_component_tooltip { + right: auto; +} diff --git a/src/addons/addons/better-img-uploads/userscript.js b/src/addons/addons/better-img-uploads/userscript.js new file mode 100644 index 0000000000000000000000000000000000000000..b91cc1704577b15eedd94b63173d5a1b425450d0 --- /dev/null +++ b/src/addons/addons/better-img-uploads/userscript.js @@ -0,0 +1,243 @@ +export default async function ({ addon, console, msg }) { + let mode = addon.settings.get("fitting"); + + addon.settings.addEventListener("change", () => { + mode = addon.settings.get("fitting"); + }); + + const createItem = (id, right) => { + const uploadMsg = msg("upload"); + const wrapper = Object.assign(document.createElement("div"), { id }); + const button = Object.assign(document.createElement("button"), { + className: `${addon.tab.scratchClass("action-menu_button")} ${addon.tab.scratchClass( + "action-menu_more-button" + )} sa-better-img-uploads-btn`, + currentitem: "false", + }); + button.dataset.for = `sa-${id}-HD Upload`; + button.dataset.tip = uploadMsg; + const img = Object.assign(document.createElement("img"), { + className: `${addon.tab.scratchClass("action-menu_more-icon")} sa-better-img-uploader`, + draggable: "false", + src: addon.self.getResource("/icon.svg") /* rewritten by pull.js */, + height: "10", + width: "10", + }); + button.append(img); + const input = Object.assign(document.createElement("input"), { + accept: ".svg, .png, .bmp, .jpg, .jpeg", + className: `${addon.tab.scratchClass( + "action-menu_file-input" /* TODO: when adding dynamicDisable, ensure compat with drag-drop */ + )} sa-better-img-uploads-input`, + multiple: "true", + type: "file", + }); + button.append(input); + wrapper.append(button); + const tooltip = Object.assign(document.createElement("div"), { + className: `__react_component_tooltip place-${right ? "left" : "right"} type-dark ${addon.tab.scratchClass( + "action-menu_tooltip" + )} sa-better-img-uploads-tooltip`, + id: `sa-${id}-HD Upload`, + textContent: uploadMsg, + }); + tooltip.dataset.id = "tooltip"; + wrapper.append(tooltip); + addon.tab.displayNoneWhileDisabled(wrapper); + return [wrapper, button, input, tooltip]; + }; + + while (true) { + //Catch all upload menus as they are created + const spriteSelector = '[class*="sprite-selector_sprite-selector_"] [class*="action-menu_more-buttons_"]'; + const stageSelector = '[class*="stage-selector_stage-selector_"] [class*="action-menu_more-buttons_"]'; + const costumeSelector = '[data-tabs] > :nth-child(3) [class*="action-menu_more-buttons_"]'; + let menu = await addon.tab.waitForElement(`${spriteSelector}, ${stageSelector}, ${costumeSelector}`, { + markAsSeen: true, + reduxCondition: (state) => !state.scratchGui.mode.isPlayerOnly, + reduxEvents: [ + "scratch-gui/mode/SET_PLAYER", + "fontsLoaded/SET_FONTS_LOADED", + "scratch-gui/locales/SELECT_LOCALE", + "scratch-gui/navigation/ACTIVATE_TAB", + ], + }); + let button = menu.parentElement.previousElementSibling.previousElementSibling; //The base button that the popup menu is from + + let id = button.getAttribute("aria-label").replace(/\s+/g, "_"); + + let isRight = //Is it on the right side of the screen? + button.parentElement.classList.contains(addon.tab.scratchClass("sprite-selector_add-button")) || + button.parentElement.classList.contains(addon.tab.scratchClass("stage-selector_add-button")); + + if (isRight) { + id += "_right"; + } + + const [menuItem, hdButton, input, tooltip] = createItem(id, isRight); + menu.prepend(menuItem); + + hdButton.addEventListener("click", (e) => { + // When clicking on the button in the "add backdrop menu", don't switch to the stage before + // a file was selected. + e.stopPropagation(); + + input.files = new FileList(); //Empty the input to make sure the change event fires even if the same file was uploaded. + input.click(); + }); + + input.addEventListener("change", (e) => { + onchange(e, id); + }); + + let observer = new MutationObserver(() => doresize(id, menu, menuItem, isRight)); + + observer.observe(menu, { attributes: true, subtree: true }); + + function doresize(id, menu, menuItem, isRight) { + let rect = menuItem.getBoundingClientRect(); + tooltip.style.top = rect.top + 2 + "px"; + tooltip.style[isRight ? "right" : "left"] = isRight + ? window.innerWidth - rect.right + rect.width + 10 + "px" + : rect.left + rect.width + "px"; + } + } + + async function onchange(e, id) { + let iD = id; //Save the id, not sure if this is really necessary? + let el = e.target; + let files = Array.from(el.files); + let processed = new Array(); + + for (let file of files) { + if (file.type.includes("svg")) { + //The file is already a svg, we should not change it... + processed.push(file); + continue; + } + + let blob = await new Promise((resolve) => { + //Get the Blob data url for the image so that we can add it to the svg + let reader = new FileReader(); + reader.addEventListener("load", () => resolve(reader.result)); + reader.readAsDataURL(file); + }); + + let i = new Image(); //New image to get the image's size + i.src = blob; + await new Promise((resolve) => { + i.onload = resolve; + }); + + let dim = { width: i.width, height: i.height }; + const originalDim = JSON.parse(JSON.stringify(dim)); + + if (mode === "fit") { + //Make sure the image fits completely in the stage + dim = getResizedWidthHeight(dim.width, dim.height); + } else if (mode === "fill") { + //Fill the stage with the image + dim.height = (dim.height / dim.width) * 480; + dim.width = 480; + if (dim.height < 360) { + dim.width = (dim.width / dim.height) * 360; + dim.height = 360; + } + if (dim.width < 480) { + dim.height = (dim.height / dim.width) * 480; + dim.width = 480; + } + } //Otherwise just leave the image the same size + + function getResizedWidthHeight(oldWidth, oldHeight) { + const STAGE_WIDTH = 479; + const STAGE_HEIGHT = 360; + const STAGE_RATIO = STAGE_WIDTH / STAGE_HEIGHT; + + // If both dimensions are smaller than or equal to corresponding stage dimension, + // double both dimensions + if (oldWidth <= STAGE_WIDTH && oldHeight <= STAGE_HEIGHT) { + return { width: oldWidth, height: oldHeight }; + } + + // If neither dimension is larger than 2x corresponding stage dimension, + // this is an in-between image, return it as is + if (oldWidth <= STAGE_WIDTH && oldHeight <= STAGE_HEIGHT) { + return { width: oldWidth, height: oldHeight }; + } + + const imageRatio = oldWidth / oldHeight; + // Otherwise, figure out how to resize + if (imageRatio >= STAGE_RATIO) { + // Wide Image + return { + width: STAGE_WIDTH, + height: Math.floor(STAGE_WIDTH / imageRatio), + }; + } + // In this case we have either: + // - A wide image, but not with as big a ratio between width and height, + // making it so that fitting the width to double stage size would leave + // the height too big to fit in double the stage height + // - A square image that's still larger than the double at least + // one of the stage dimensions, so pick the smaller of the two dimensions (to fit) + // - A tall image + // In any of these cases, resize the image to fit the height to double the stage height + return { + width: Math.floor(STAGE_HEIGHT * imageRatio), + height: STAGE_HEIGHT, + }; + } + + processed.push( + new File( //Create the svg file + [ + ` + + + + + + `, + ], + `${file.name.replace(/(.*)\..*/, "$1")}.svg`, + { + type: "image/svg+xml", + } + ) + ); + } + + (el = document.getElementById(iD).nextElementSibling.querySelector("input")).files = new FileList(processed); //Convert processed image array to a FileList, which is not normally constructible. + + el.dispatchEvent(new e.constructor(e.type, e)); //Start a new, duplicate, event, but allow scratch to receive it this time. + } + + function FileList(arr = []) { + //File list constructor. Does not need the `new` keyword, but it is easier to read + let filelist = new DataTransfer(); //This "creates" a FileList that we can add files to + for (let file of arr) { + filelist.items.add(file); + } + return filelist.files; //Completed FileList + } +} diff --git a/src/addons/addons/bitmap-copy/_manifest_entry.js b/src/addons/addons/bitmap-copy/_manifest_entry.js new file mode 100644 index 0000000000000000000000000000000000000000..7e2b13da30a9978bc5d7ce1dc8df569f8a8b6e1d --- /dev/null +++ b/src/addons/addons/bitmap-copy/_manifest_entry.js @@ -0,0 +1,25 @@ +/* generated by pull.js */ +const manifest = { + "editorOnly": true, + "noTranslations": true, + "name": "Bitmap images copying", + "description": "Allows you to copy a bitmap image from the costume editor into the system clipboard, so that you can paste it in other websites or software.", + "info": [ + { + "type": "notice", + "text": "\"Right click → copy\" is not supported. You must press Ctrl+C while a bitmap image is selected.", + "id": "norightclick" + } + ], + "userscripts": [ + { + "url": "userscript.js" + } + ], + "dynamicDisable": true, + "tags": [], + "enabledByDefault": true +}; +import {clipboardSupported} from "../../environment"; +if (!clipboardSupported) manifest.unsupported = true; +export default manifest; diff --git a/src/addons/addons/bitmap-copy/_runtime_entry.js b/src/addons/addons/bitmap-copy/_runtime_entry.js new file mode 100644 index 0000000000000000000000000000000000000000..bc67131957e52185c142f348760610cfaa4f774d --- /dev/null +++ b/src/addons/addons/bitmap-copy/_runtime_entry.js @@ -0,0 +1,5 @@ +/* generated by pull.js */ +import _js from "./userscript.js"; +export const resources = { + "userscript.js": _js, +}; diff --git a/src/addons/addons/bitmap-copy/userscript.js b/src/addons/addons/bitmap-copy/userscript.js new file mode 100644 index 0000000000000000000000000000000000000000..e68c597bdc48f3e98f94c84e8a46dc0c83411990 --- /dev/null +++ b/src/addons/addons/bitmap-copy/userscript.js @@ -0,0 +1,19 @@ +export default async ({ addon, console }) => { + if (!addon.tab.redux.state) return console.warn("Redux is not available!"); + addon.tab.redux.initialize(); + addon.tab.redux.addEventListener("statechanged", ({ detail }) => { + if (addon.self.disabled) return; + const e = detail; + if (!e.action || e.action.type !== "scratch-paint/clipboard/SET") return; + const items = e.next.scratchPaint.clipboard.items; + if (items.length !== 1) return; + const firstItem = items[0]; + // TODO vector support + if (!Array.isArray(firstItem) || firstItem[0] !== "Raster") return console.log("copied element is vector"); + const dataURL = firstItem[1].source; + addon.tab + .copyImage(dataURL) + .then(() => console.log("Image successfully copied")) + .catch((e) => console.error(`Image could not be copied: ${e}`)); + }); +}; diff --git a/src/addons/addons/block-cherry-picking/_manifest_entry.js b/src/addons/addons/block-cherry-picking/_manifest_entry.js new file mode 100644 index 0000000000000000000000000000000000000000..12c050c6fb01ae036d39de676b133ecff6850d29 --- /dev/null +++ b/src/addons/addons/block-cherry-picking/_manifest_entry.js @@ -0,0 +1,44 @@ +/* generated by pull.js */ +const manifest = { + "editorOnly": true, + "noTranslations": true, + "name": "Grab single block with Ctrl key", + "description": "Adds the ability to drag a single block out of the middle of a script (instead of the entire stack attached below it) while holding the Ctrl key.", + "info": [ + { + "text": "On macOS, use the Cmd key instead of the Ctrl key.", + "id": "macContextDisabled" + }, + { + "text": "If \"flip controls\" is enabled, grabbing blocks individually will be the default behavior. Hold Ctrl to drag the entire stack.", + "id": "flipControls" + } + ], + "credits": [ + { + "name": "lisa_wolfgang", + "link": "https://scratch.mit.edu/users/lisa_wolfgang/" + }, + { + "name": "GarboMuffin" + } + ], + "userscripts": [ + { + "url": "userscript.js" + } + ], + "settings": [ + { + "dynamic": true, + "name": "Flip controls", + "id": "invertDrag", + "type": "boolean", + "default": false + } + ], + "tags": [], + "dynamicDisable": true, + "enabledByDefault": true +}; +export default manifest; diff --git a/src/addons/addons/block-cherry-picking/_runtime_entry.js b/src/addons/addons/block-cherry-picking/_runtime_entry.js new file mode 100644 index 0000000000000000000000000000000000000000..bc67131957e52185c142f348760610cfaa4f774d --- /dev/null +++ b/src/addons/addons/block-cherry-picking/_runtime_entry.js @@ -0,0 +1,5 @@ +/* generated by pull.js */ +import _js from "./userscript.js"; +export const resources = { + "userscript.js": _js, +}; diff --git a/src/addons/addons/block-cherry-picking/userscript.js b/src/addons/addons/block-cherry-picking/userscript.js new file mode 100644 index 0000000000000000000000000000000000000000..cafdc2c83c3176a9ec45d886adf400383d6c49ea --- /dev/null +++ b/src/addons/addons/block-cherry-picking/userscript.js @@ -0,0 +1,12 @@ +import * as sharedModule from "../block-duplicate/module.js"; + +export default async function ({ addon, console }) { + const update = () => { + sharedModule.setCherryPicking(!addon.self.disabled, addon.settings.get("invertDrag")); + }; + addon.self.addEventListener("disabled", update); + addon.self.addEventListener("reenabled", update); + addon.settings.addEventListener("change", update); + update(); + sharedModule.load(addon); +} diff --git a/src/addons/addons/block-count/_manifest_entry.js b/src/addons/addons/block-count/_manifest_entry.js new file mode 100644 index 0000000000000000000000000000000000000000..bf7d9b1ffa996830af7654dc87c65d65aad408a0 --- /dev/null +++ b/src/addons/addons/block-count/_manifest_entry.js @@ -0,0 +1,21 @@ +/* generated by pull.js */ +const manifest = { + "enabledByDefault": true, + "editorOnly": true, + "name": "Block count", + "description": "Shows the total number of blocks in a project in the editor menu bar. Previously part of \"sprite and script count\".", + "tags": [], + "credits": [ + { + "name": "TheColaber", + "link": "https://scratch.mit.edu/users/TheColaber/" + } + ], + "dynamicDisable": true, + "userscripts": [ + { + "url": "blockcount.js" + } + ] +}; +export default manifest; diff --git a/src/addons/addons/block-count/_runtime_entry.js b/src/addons/addons/block-count/_runtime_entry.js new file mode 100644 index 0000000000000000000000000000000000000000..6734a73bacba079da429b839d12fdddb7b347aa3 --- /dev/null +++ b/src/addons/addons/block-count/_runtime_entry.js @@ -0,0 +1,5 @@ +/* generated by pull.js */ +import _js from "./blockcount.js"; +export const resources = { + "blockcount.js": _js, +}; diff --git a/src/addons/addons/block-count/blockcount.js b/src/addons/addons/block-count/blockcount.js new file mode 100644 index 0000000000000000000000000000000000000000..774cb396f587db9b81bdbd16fb217b580f1e4ed5 --- /dev/null +++ b/src/addons/addons/block-count/blockcount.js @@ -0,0 +1,60 @@ +export default async function ({ addon, console, msg }) { + const vm = addon.tab.traps.vm; + + const getBlockCount = () => { + let blockCount = 0; + let scriptCount = 0; + let sprites = new Set(vm.runtime.targets.map((i) => i.sprite.blocks._blocks)); + sprites.forEach((sprite, i) => { + scriptCount += Object.values(sprite).filter((o) => !o.parent).length; // Filter blocks that don't have a parent (meaning it's the top of a stack) + blockCount += Object.values(sprite).filter((o) => !o.shadow).length; // shadow blocks should be filtered out + }); + return { + blockCount, + scriptCount, + spriteCount: sprites.size - 1, // Backdrop counts as a target so we can subtract it + }; + }; + + const addLiveBlockCount = async () => { + if (vm.editingTarget) { + let handler = null; + while (true) { + const topBar = await addon.tab.waitForElement("[class^='menu-bar_main-menu']", { + markAsSeen: true, + reduxEvents: [ + "scratch-gui/mode/SET_PLAYER", + "fontsLoaded/SET_FONTS_LOADED", + "scratch-gui/locales/SELECT_LOCALE", + ], + reduxCondition: (state) => !state.scratchGui.mode.isPlayerOnly, + }); + let display = topBar.appendChild(document.createElement("span")); + addon.tab.displayNoneWhileDisabled(display); + display.style.order = 1; + display.style.padding = "9px"; + display.innerText = msg("blocks", { num: getBlockCount().blockCount }); + let debounce; // debouncing values because of the way 'PROJECT_CHANGED' works + if (handler) { + vm.off("PROJECT_CHANGED", handler); + vm.runtime.off("PROJECT_LOADED", handler); + } + handler = async () => { + clearTimeout(debounce); + debounce = setTimeout(async () => { + display.innerText = msg("blocks", { num: getBlockCount().blockCount }); + }, 1000); + }; + vm.on("PROJECT_CHANGED", handler); + vm.runtime.on("PROJECT_LOADED", handler); + } + } else { + let timeout = setTimeout(function () { + addLiveBlockCount(); + clearTimeout(timeout); + }, 1000); + } + }; + + addLiveBlockCount(); +} diff --git a/src/addons/addons/block-duplicate/_manifest_entry.js b/src/addons/addons/block-duplicate/_manifest_entry.js new file mode 100644 index 0000000000000000000000000000000000000000..76b8aa2063c10759206a27957db33a1bd1d176be --- /dev/null +++ b/src/addons/addons/block-duplicate/_manifest_entry.js @@ -0,0 +1,27 @@ +/* generated by pull.js */ +const manifest = { + "editorOnly": true, + "noTranslations": true, + "name": "Duplicate script with Alt key", + "description": "Quickly duplicate a script by dragging it while holding the Alt key. Hold Ctrl as well to only duplicate a single block instead of the entire stack attached below it.", + "credits": [ + { + "name": "GarboMuffin" + } + ], + "info": [ + { + "text": "On macOS, use the Option key instead of the Alt key and Command key instead of the Control key.", + "id": "mac" + } + ], + "userscripts": [ + { + "url": "userscript.js" + } + ], + "dynamicDisable": true, + "tags": [], + "enabledByDefault": true +}; +export default manifest; diff --git a/src/addons/addons/block-duplicate/_runtime_entry.js b/src/addons/addons/block-duplicate/_runtime_entry.js new file mode 100644 index 0000000000000000000000000000000000000000..bc67131957e52185c142f348760610cfaa4f774d --- /dev/null +++ b/src/addons/addons/block-duplicate/_runtime_entry.js @@ -0,0 +1,5 @@ +/* generated by pull.js */ +import _js from "./userscript.js"; +export const resources = { + "userscript.js": _js, +}; diff --git a/src/addons/addons/block-duplicate/module.js b/src/addons/addons/block-duplicate/module.js new file mode 100644 index 0000000000000000000000000000000000000000..811ded253ecd5f13b59cc057ccf0a5c744a8e0f9 --- /dev/null +++ b/src/addons/addons/block-duplicate/module.js @@ -0,0 +1,105 @@ +let enableCherryPicking = false; +let invertCherryPicking = false; +export function setCherryPicking(newEnabled, newInverted) { + enableCherryPicking = newEnabled; + // If cherry picking is disabled, also disable invert. Duplicating blocks can still cause + // this setting to be used. + invertCherryPicking = newEnabled && newInverted; +} + +let enableDuplication = false; +export function setDuplication(newEnabled) { + enableDuplication = newEnabled; +} + +// mostRecentEvent_ is sometimes a fake event, so we can't rely on reading its properties. +let ctrlOrMetaPressed = false; +let altPressed = false; +document.addEventListener( + "mousedown", + function (e) { + ctrlOrMetaPressed = e.ctrlKey || e.metaKey; + altPressed = e.altKey; + }, + { + capture: true, + } +); + +let loaded = false; + +export async function load(addon) { + if (loaded) { + return; + } + loaded = true; + + const ScratchBlocks = await addon.tab.traps.getBlockly(); + + // https://github.com/LLK/scratch-blocks/blob/912b8cc728bea8fd91af85078c64fcdbfe21c87a/core/gesture.js#L454 + const originalStartDraggingBlock = ScratchBlocks.Gesture.prototype.startDraggingBlock_; + ScratchBlocks.Gesture.prototype.startDraggingBlock_ = function (...args) { + let block = this.targetBlock_; + + // Scratch uses fake mouse events to implement right click > duplicate + const isRightClickDuplicate = !(this.mostRecentEvent_ instanceof MouseEvent); + + const isDuplicating = + enableDuplication && + altPressed && + !isRightClickDuplicate && + !this.flyout_ && + !this.shouldDuplicateOnDrag_ && + (this.targetBlock_.type !== "procedures_definition" || + this.targetBlock_.type !== "procedures_definition_return"); + + const isCherryPickingInverted = invertCherryPicking && !isRightClickDuplicate && block.getParent(); + const canCherryPick = enableCherryPicking || isDuplicating; + const isCherryPicking = canCherryPick && ctrlOrMetaPressed === !isCherryPickingInverted && !block.isShadow(); + + if (isDuplicating || isCherryPicking) { + if (!ScratchBlocks.Events.getGroup()) { + // Scratch will disable grouping on its own later. + ScratchBlocks.Events.setGroup(true); + } + } + + if (isDuplicating) { + // Based on https://github.com/LLK/scratch-blocks/blob/feda366947432b9d82a4f212f43ff6d4ab6f252f/core/scratch_blocks_utils.js#L171 + // Setting this.shouldDuplicateOnDrag_ = true does NOT work because it doesn't call changeObscuredShadowIds + this.startWorkspace_.setResizesEnabled(false); + ScratchBlocks.Events.disable(); + let newBlock; + try { + const xmlBlock = ScratchBlocks.Xml.blockToDom(block); + newBlock = ScratchBlocks.Xml.domToBlock(xmlBlock, this.startWorkspace_); + ScratchBlocks.scratchBlocksUtils.changeObscuredShadowIds(newBlock); + const xy = block.getRelativeToSurfaceXY(); + newBlock.moveBy(xy.x, xy.y); + } catch (e) { + console.error(e); + } + ScratchBlocks.Events.enable(); + + if (newBlock) { + block = newBlock; + this.targetBlock_ = newBlock; + if (ScratchBlocks.Events.isEnabled()) { + ScratchBlocks.Events.fire(new ScratchBlocks.Events.BlockCreate(newBlock)); + } + } + } + + if (isCherryPicking) { + if (isRightClickDuplicate || isDuplicating) { + const nextBlock = block.getNextBlock(); + if (nextBlock) { + nextBlock.dispose(); + } + } + block.unplug(true); + } + + return originalStartDraggingBlock.call(this, ...args); + }; +} diff --git a/src/addons/addons/block-duplicate/userscript.js b/src/addons/addons/block-duplicate/userscript.js new file mode 100644 index 0000000000000000000000000000000000000000..7659baddc79dd7b13c9a8c38fa05ca2b6235f5af --- /dev/null +++ b/src/addons/addons/block-duplicate/userscript.js @@ -0,0 +1,11 @@ +import * as sharedModule from "./module.js"; + +export default async function ({ addon, console }) { + const update = () => { + sharedModule.setDuplication(!addon.self.disabled); + }; + addon.self.addEventListener("disabled", update); + addon.self.addEventListener("reenabled", update); + update(); + sharedModule.load(addon); +} diff --git a/src/addons/addons/block-palette-icons/_manifest_entry.js b/src/addons/addons/block-palette-icons/_manifest_entry.js new file mode 100644 index 0000000000000000000000000000000000000000..da597d3fe560fae3c63881eb73871e5c37a08b00 --- /dev/null +++ b/src/addons/addons/block-palette-icons/_manifest_entry.js @@ -0,0 +1,27 @@ +/* generated by pull.js */ +const manifest = { + "editorOnly": true, + "name": "Block palette category icons", + "description": "Adds icons inside the colored circles that identify block categories.", + "tags": [ + "theme" + ], + "enabledByDefault": false, + "dynamicDisable": true, + "userstyles": [ + { + "url": "userstyle.css" + } + ], + "credits": [ + { + "name": "--Explosion--", + "link": "https://scratch.mit.edu/users/--Explosion--/" + }, + { + "name": "RedGuy7", + "link": "https://scratch.mit.edu/users/RedGuy7/" + } + ] +}; +export default manifest; diff --git a/src/addons/addons/block-palette-icons/_runtime_entry.js b/src/addons/addons/block-palette-icons/_runtime_entry.js new file mode 100644 index 0000000000000000000000000000000000000000..329537fa1da65c1984aa2cf40e769122615b86f1 --- /dev/null +++ b/src/addons/addons/block-palette-icons/_runtime_entry.js @@ -0,0 +1,25 @@ +/* generated by pull.js */ +import _css from "!css-loader!./userstyle.css"; +import _asset from "!url-loader!./icons/block_icon.svg"; +import _asset2 from "!url-loader!./icons/control_icon.svg"; +import _asset3 from "!url-loader!./icons/events_icon.svg"; +import _asset4 from "!url-loader!./icons/list_icon.svg"; +import _asset5 from "!url-loader!./icons/looks_icon.svg"; +import _asset6 from "!url-loader!./icons/motion_icon.svg"; +import _asset7 from "!url-loader!./icons/operators_icon.svg"; +import _asset8 from "!url-loader!./icons/sensing_icon.svg"; +import _asset9 from "!url-loader!./icons/sound_icon.svg"; +import _asset10 from "!url-loader!./icons/variables_icon.svg"; +export const resources = { + "userstyle.css": _css, + "icons/block_icon.svg": _asset, + "icons/control_icon.svg": _asset2, + "icons/events_icon.svg": _asset3, + "icons/list_icon.svg": _asset4, + "icons/looks_icon.svg": _asset5, + "icons/motion_icon.svg": _asset6, + "icons/operators_icon.svg": _asset7, + "icons/sensing_icon.svg": _asset8, + "icons/sound_icon.svg": _asset9, + "icons/variables_icon.svg": _asset10, +}; diff --git a/src/addons/addons/block-palette-icons/icons/block_icon.svg b/src/addons/addons/block-palette-icons/icons/block_icon.svg new file mode 100644 index 0000000000000000000000000000000000000000..9be550cfa8c938d32b8fc35a179eb35b03350476 Binary files /dev/null and b/src/addons/addons/block-palette-icons/icons/block_icon.svg differ diff --git a/src/addons/addons/block-palette-icons/icons/control_icon.svg b/src/addons/addons/block-palette-icons/icons/control_icon.svg new file mode 100644 index 0000000000000000000000000000000000000000..4fb2fa1876a977c0df285e7fc8f656097592f9a1 Binary files /dev/null and b/src/addons/addons/block-palette-icons/icons/control_icon.svg differ diff --git a/src/addons/addons/block-palette-icons/icons/events_icon.svg b/src/addons/addons/block-palette-icons/icons/events_icon.svg new file mode 100644 index 0000000000000000000000000000000000000000..b148a7cfebde18de7005fa48903c75d8013daa46 Binary files /dev/null and b/src/addons/addons/block-palette-icons/icons/events_icon.svg differ diff --git a/src/addons/addons/block-palette-icons/icons/list_icon.svg b/src/addons/addons/block-palette-icons/icons/list_icon.svg new file mode 100644 index 0000000000000000000000000000000000000000..5285be47e645fb7be15819ad68f200bae6a94dd6 Binary files /dev/null and b/src/addons/addons/block-palette-icons/icons/list_icon.svg differ diff --git a/src/addons/addons/block-palette-icons/icons/looks_icon.svg b/src/addons/addons/block-palette-icons/icons/looks_icon.svg new file mode 100644 index 0000000000000000000000000000000000000000..91a3241fcaf7effc84fcd439184a8e2bdb42455d Binary files /dev/null and b/src/addons/addons/block-palette-icons/icons/looks_icon.svg differ diff --git a/src/addons/addons/block-palette-icons/icons/motion_icon.svg b/src/addons/addons/block-palette-icons/icons/motion_icon.svg new file mode 100644 index 0000000000000000000000000000000000000000..97fb2c6362510904afe3a1dd9fecc0b73bc6760f Binary files /dev/null and b/src/addons/addons/block-palette-icons/icons/motion_icon.svg differ diff --git a/src/addons/addons/block-palette-icons/icons/operators_icon.svg b/src/addons/addons/block-palette-icons/icons/operators_icon.svg new file mode 100644 index 0000000000000000000000000000000000000000..d8316cdc4bf63b3b5c4f8fe2a062356cea5c14e5 Binary files /dev/null and b/src/addons/addons/block-palette-icons/icons/operators_icon.svg differ diff --git a/src/addons/addons/block-palette-icons/icons/sensing_icon.svg b/src/addons/addons/block-palette-icons/icons/sensing_icon.svg new file mode 100644 index 0000000000000000000000000000000000000000..de698463dd9b69668377a681438e3d49443e33d3 Binary files /dev/null and b/src/addons/addons/block-palette-icons/icons/sensing_icon.svg differ diff --git a/src/addons/addons/block-palette-icons/icons/sound_icon.svg b/src/addons/addons/block-palette-icons/icons/sound_icon.svg new file mode 100644 index 0000000000000000000000000000000000000000..68ff3ae2a4282f796a7fbeabfbaec219a73609cd Binary files /dev/null and b/src/addons/addons/block-palette-icons/icons/sound_icon.svg differ diff --git a/src/addons/addons/block-palette-icons/icons/variables_icon.svg b/src/addons/addons/block-palette-icons/icons/variables_icon.svg new file mode 100644 index 0000000000000000000000000000000000000000..025a3de0a5f63555a590a320b1ba139ce76990aa Binary files /dev/null and b/src/addons/addons/block-palette-icons/icons/variables_icon.svg differ diff --git a/src/addons/addons/block-palette-icons/userstyle.css b/src/addons/addons/block-palette-icons/userstyle.css new file mode 100644 index 0000000000000000000000000000000000000000..a1f3f45519aab7251a2cf94f3a2c81c7b9f383cc --- /dev/null +++ b/src/addons/addons/block-palette-icons/userstyle.css @@ -0,0 +1,55 @@ +.scratchCategoryItemBubble { + position: relative; +} + +.scratchCategoryItemBubble::after { + content: ""; + position: absolute; + top: 0; + left: 0; + bottom: 0; + right: 0; + background-position: center; + background-repeat: no-repeat; + background-size: cover; +} + +.scratchCategoryId-motion .scratchCategoryItemBubble::after { + background-image: url(icons/motion_icon.svg); +} + +.scratchCategoryId-looks .scratchCategoryItemBubble::after { + background-image: url(icons/looks_icon.svg); +} + +.scratchCategoryId-sound .scratchCategoryItemBubble::after { + background-image: url(icons/sound_icon.svg); +} + +.scratchCategoryId-events .scratchCategoryItemBubble::after { + background-image: url(icons/events_icon.svg); +} + +.scratchCategoryId-control .scratchCategoryItemBubble::after { + background-image: url(icons/control_icon.svg); +} + +.scratchCategoryId-sensing .scratchCategoryItemBubble::after { + background-image: url(icons/sensing_icon.svg); +} + +.scratchCategoryId-operators .scratchCategoryItemBubble::after { + background-image: url(icons/operators_icon.svg); +} + +.scratchCategoryId-variables .scratchCategoryItemBubble::after { + background-image: url(icons/variables_icon.svg); +} + +.scratchCategoryId-lists .scratchCategoryItemBubble::after { + background-image: url(icons/list_icon.svg); +} + +.scratchCategoryId-myBlocks .scratchCategoryItemBubble::after { + background-image: url(icons/block_icon.svg); +} diff --git a/src/addons/addons/block-switching/_manifest_entry.js b/src/addons/addons/block-switching/_manifest_entry.js new file mode 100644 index 0000000000000000000000000000000000000000..a9c4dbd8cf206055f2388d93adda4ac2ff8e6def --- /dev/null +++ b/src/addons/addons/block-switching/_manifest_entry.js @@ -0,0 +1,143 @@ +/* generated by pull.js */ +const manifest = { + "editorOnly": true, + "name": "Block switching", + "description": "Right click on a block to switch it to a related block.", + "credits": [ + { + "name": "GarboMuffin" + }, + { + "name": "pufferfish101007", + "link": "https://scratch.mit.edu/users/pufferfish101007/" + }, + { + "name": "JeremyGamer13", + "link": "https://penguinmod.com/profile?user=JGamerTesting" + } + ], + "dynamicDisable": true, + "userscripts": [ + { + "url": "userscript.js" + } + ], + "tags": [ + "recommended" + ], + "settings": [ + { + "dynamic": true, + "name": "Motion blocks", + "id": "motion", + "type": "boolean", + "default": true + }, + { + "dynamic": true, + "name": "Looks blocks", + "id": "looks", + "type": "boolean", + "default": true + }, + { + "dynamic": true, + "name": "Sound blocks", + "id": "sound", + "type": "boolean", + "default": true + }, + { + "dynamic": true, + "name": "Event blocks", + "id": "event", + "type": "boolean", + "default": true + }, + { + "dynamic": true, + "name": "Control blocks", + "id": "control", + "type": "boolean", + "default": true + }, + { + "dynamic": true, + "name": "Operator blocks", + "id": "operator", + "type": "boolean", + "default": true + }, + { + "dynamic": true, + "name": "Sensing blocks", + "id": "sensing", + "type": "boolean", + "default": true + }, + { + "dynamic": true, + "name": "Data blocks", + "id": "data", + "type": "boolean", + "default": true + }, + { + "dynamic": true, + "name": "Extension blocks", + "id": "extension", + "type": "boolean", + "default": true + }, + { + "dynamic": true, + "name": "Addon blocks", + "id": "sa", + "type": "boolean", + "default": true, + "if": { + "addonEnabled": [ + "debugger" + ] + } + }, + { + "dynamic": true, + "name": "Custom block arguments", + "id": "customargs", + "type": "boolean", + "default": true + }, + { + "dynamic": true, + "name": "Shown custom block arguments options", + "id": "customargsmode", + "type": "select", + "default": "defOnly", + "potentialValues": [ + { + "id": "defOnly", + "name": "Arguments in own custom block" + }, + { + "id": "all", + "name": "Arguments in all custom blocks in sprite" + } + ], + "if": { + "settings": { + "customargs": true + } + } + }, + { + "dynamic": true, + "name": "Show option to change block to self", + "id": "noop", + "type": "boolean", + "default": true + } + ], + "enabledByDefault": true +}; +export default manifest; diff --git a/src/addons/addons/block-switching/_runtime_entry.js b/src/addons/addons/block-switching/_runtime_entry.js new file mode 100644 index 0000000000000000000000000000000000000000..bc67131957e52185c142f348760610cfaa4f774d --- /dev/null +++ b/src/addons/addons/block-switching/_runtime_entry.js @@ -0,0 +1,5 @@ +/* generated by pull.js */ +import _js from "./userscript.js"; +export const resources = { + "userscript.js": _js, +}; diff --git a/src/addons/addons/block-switching/userscript.js b/src/addons/addons/block-switching/userscript.js new file mode 100644 index 0000000000000000000000000000000000000000..af244717b1b0d43e08c8b25ed0230cb61a7219a9 --- /dev/null +++ b/src/addons/addons/block-switching/userscript.js @@ -0,0 +1,1261 @@ +/* eslint-disable */ + +export default async function ({ addon, console, msg }) { + const ScratchBlocks = await addon.tab.traps.getBlockly(); + const vm = addon.tab.traps.vm; + + let blockSwitches = {}; + let procedureSwitches = {}; + const noopSwitch = { + isNoop: true, + }; + + const randomColor = () => { + const num = Math.floor(Math.random() * 256 * 256 * 256); + return `#${num.toString(16).padStart(6, "0")}`; + }; + + const buildSwitches = () => { + blockSwitches = {}; + procedureSwitches = {}; + + if (addon.settings.get("motion")) { + blockSwitches["motion_turnright"] = [ + noopSwitch, + { + opcode: "motion_turnleft", + }, + ]; + blockSwitches["motion_turnleft"] = [ + { + opcode: "motion_turnright", + }, + noopSwitch, + ]; + blockSwitches["motion_gotoxy"] = [ + noopSwitch, + { + opcode: "motion_changebyxy", + remapInputName: { X: "DX", Y: "DY" }, + } + ]; + blockSwitches["motion_changebyxy"] = [ + { + opcode: "motion_gotoxy", + remapInputName: { DX: "X", DY: "Y" }, + }, + noopSwitch, + ]; + blockSwitches["motion_setx"] = [ + noopSwitch, + { + opcode: "motion_changexby", + remapInputName: { X: "DX" }, + }, + { + opcode: "motion_sety", + remapInputName: { X: "Y" }, + }, + { + opcode: "motion_changeyby", + remapInputName: { X: "DY" }, + }, + ]; + blockSwitches["motion_changexby"] = [ + { + opcode: "motion_setx", + remapInputName: { DX: "X" }, + }, + noopSwitch, + { + opcode: "motion_sety", + remapInputName: { DX: "Y" }, + }, + { + opcode: "motion_changeyby", + remapInputName: { DX: "DY" }, + }, + ]; + blockSwitches["motion_sety"] = [ + { + opcode: "motion_setx", + remapInputName: { Y: "X" }, + }, + { + opcode: "motion_changexby", + remapInputName: { Y: "DX" }, + }, + noopSwitch, + { + opcode: "motion_changeyby", + remapInputName: { Y: "DY" }, + }, + ]; + blockSwitches["motion_changeyby"] = [ + { + opcode: "motion_setx", + remapInputName: { DY: "X" }, + }, + { + opcode: "motion_changexby", + remapInputName: { DY: "DX" }, + }, + { + opcode: "motion_sety", + remapInputName: { DY: "Y" }, + }, + noopSwitch, + ]; + blockSwitches["motion_xposition"] = [ + noopSwitch, + { + opcode: "motion_yposition", + }, + ]; + blockSwitches["motion_yposition"] = [ + { + opcode: "motion_xposition", + }, + noopSwitch, + ]; + } + + if (addon.settings.get("looks")) { + blockSwitches["looks_seteffectto"] = [ + noopSwitch, + { + opcode: "looks_changeeffectby", + remapInputName: { VALUE: "CHANGE" }, + }, + ]; + blockSwitches["looks_changeeffectby"] = [ + { + opcode: "looks_seteffectto", + remapInputName: { CHANGE: "VALUE" }, + }, + noopSwitch, + ]; + blockSwitches["looks_setsizeto"] = [ + noopSwitch, + { + opcode: "looks_changesizeby", + remapInputName: { SIZE: "CHANGE" }, + }, + ]; + blockSwitches["looks_changesizeby"] = [ + { + opcode: "looks_setsizeto", + remapInputName: { CHANGE: "SIZE" }, + }, + noopSwitch, + ]; + blockSwitches["looks_costumenumbername"] = [ + noopSwitch, + { + opcode: "looks_backdropnumbername", + }, + ]; + blockSwitches["looks_backdropnumbername"] = [ + { + opcode: "looks_costumenumbername", + }, + noopSwitch, + ]; + blockSwitches["looks_show"] = [ + noopSwitch, + { + opcode: "looks_hide", + }, + ]; + blockSwitches["looks_hide"] = [ + { + opcode: "looks_show", + }, + noopSwitch, + ]; + blockSwitches["looks_setShape"] = [ + { + opcode: "looks_setShape", + }, + noopSwitch, + ]; + blockSwitches["looks_setColor"] = [ + { + opcode: "looks_setColor", + }, + noopSwitch, + ]; + blockSwitches["looks_setFont"] = [ + { + opcode: "looks_setFont", + }, + noopSwitch, + ]; + blockSwitches["looks_nextcostume"] = [ + noopSwitch, + { + opcode: "looks_nextbackdrop", + }, + ]; + blockSwitches["looks_nextbackdrop"] = [ + { + opcode: "looks_nextcostume", + }, + noopSwitch, + ]; + blockSwitches["looks_say"] = [ + noopSwitch, + { + opcode: "looks_sayforsecs", + createInputs: { + SECS: { + shadowType: "math_number", + value: "2", + }, + }, + }, + { + opcode: "looks_think", + }, + { + opcode: "looks_thinkforsecs", + createInputs: { + SECS: { + shadowType: "math_number", + value: "2", + }, + }, + }, + ]; + blockSwitches["looks_think"] = [ + { + opcode: "looks_say", + }, + { + opcode: "looks_sayforsecs", + createInputs: { + SECS: { + shadowType: "math_number", + value: "2", + }, + }, + }, + noopSwitch, + { + opcode: "looks_thinkforsecs", + createInputs: { + SECS: { + shadowType: "math_number", + value: "2", + }, + }, + }, + ]; + blockSwitches["looks_sayforsecs"] = [ + { + opcode: "looks_say", + splitInputs: ["SECS"], + }, + { + opcode: "looks_think", + splitInputs: ["SECS"], + }, + noopSwitch, + { + opcode: "looks_thinkforsecs", + }, + ]; + blockSwitches["looks_thinkforsecs"] = [ + { + opcode: "looks_say", + splitInputs: ["SECS"], + }, + { + opcode: "looks_think", + splitInputs: ["SECS"], + }, + { + opcode: "looks_sayforsecs", + }, + noopSwitch, + ]; + blockSwitches["looks_switchbackdropto"] = [ + noopSwitch, + { + opcode: "looks_switchbackdroptoandwait", + }, + ]; + blockSwitches["looks_switchbackdroptoandwait"] = [ + { + opcode: "looks_switchbackdropto", + }, + noopSwitch, + ]; + blockSwitches["looks_gotofrontback"] = [ + noopSwitch, + { + opcode: "looks_goforwardbackwardlayers", + remapInputName: { + FRONT_BACK: "FORWARD_BACKWARD", + }, + mapFieldValues: { + FRONT_BACK: { + front: "forward", + back: "backward", + }, + }, + createInputs: { + NUM: { + shadowType: "math_integer", + value: "1", + }, + }, + }, + ]; + blockSwitches["looks_goforwardbackwardlayers"] = [ + { + opcode: "looks_gotofrontback", + splitInputs: ["NUM"], + remapInputName: { + FORWARD_BACKWARD: "FRONT_BACK", + }, + mapFieldValues: { + FORWARD_BACKWARD: { + forward: "front", + backward: "back", + }, + }, + }, + noopSwitch, + ]; + } + + if (addon.settings.get("sound")) { + blockSwitches["sound_play"] = [ + noopSwitch, + { + opcode: "sound_playuntildone", + }, + ]; + blockSwitches["sound_playuntildone"] = [ + { + opcode: "sound_play", + }, + noopSwitch, + ]; + blockSwitches["sound_seteffectto"] = [ + noopSwitch, + { + opcode: "sound_changeeffectby", + }, + ]; + blockSwitches["sound_changeeffectby"] = [ + { + opcode: "sound_seteffectto", + }, + noopSwitch, + ]; + blockSwitches["sound_setvolumeto"] = [ + noopSwitch, + { + opcode: "sound_changevolumeby", + }, + ]; + blockSwitches["sound_changevolumeby"] = [ + { + opcode: "sound_setvolumeto", + }, + noopSwitch, + ]; + } + + if (addon.settings.get("event")) { + blockSwitches["event_broadcast"] = [ + noopSwitch, + { + opcode: "event_broadcastandwait", + }, + ]; + blockSwitches["event_broadcastandwait"] = [ + { + opcode: "event_broadcast", + }, + noopSwitch, + ]; + } + + if (addon.settings.get("control")) { + blockSwitches["control_if"] = [ + noopSwitch, + { + opcode: "control_if_else", + }, + ]; + blockSwitches["control_if_else"] = [ + { + opcode: "control_if", + splitInputs: ["SUBSTACK2"], + }, + noopSwitch, + ]; + blockSwitches["control_repeat_until"] = [ + noopSwitch, + { + opcode: "control_while", + }, + { + opcode: "control_wait_until", + splitInputs: ["SUBSTACK"], + }, + { + opcode: "control_forever", + splitInputs: ["CONDITION"], + }, + ]; + blockSwitches["control_forever"] = [ + { + opcode: "control_repeat_until", + }, + { + opcode: "control_while", + }, + noopSwitch, + ]; + blockSwitches["control_wait_until"] = [ + { + opcode: "control_repeat_until", + }, + noopSwitch, + ]; + + blockSwitches["control_while"] = [ + { + opcode: "control_repeat_until", + }, + noopSwitch, + { + opcode: "control_forever", + splitInputs: ["CONDITION"], + }, + ]; + } + + if (addon.settings.get("operator")) { + blockSwitches["operator_equals"] = [ + { + opcode: "operator_gt", + }, + { + opcode: "operator_gtorequal", + }, + { + opcode: "operator_lt", + }, + { + opcode: "operator_ltorequal", + }, + noopSwitch, + { + opcode: "operator_notequal", + }, + ]; + blockSwitches["operator_gt"] = [ + noopSwitch, + { + opcode: "operator_gtorequal", + }, + { + opcode: "operator_lt", + }, + { + opcode: "operator_ltorequal", + }, + { + opcode: "operator_equals", + }, + { + opcode: "operator_notequal", + }, + ]; + blockSwitches["operator_lt"] = [ + { + opcode: "operator_gt", + }, + { + opcode: "operator_gtorequal", + }, + noopSwitch, + { + opcode: "operator_ltorequal", + }, + { + opcode: "operator_equals", + }, + { + opcode: "operator_notequal", + }, + ]; + blockSwitches["operator_notequal"] = [ + { + opcode: "operator_gt", + }, + { + opcode: "operator_gtorequal", + }, + { + opcode: "operator_lt", + }, + { + opcode: "operator_ltorequal", + }, + { + opcode: "operator_equals", + }, + noopSwitch, + ]; + blockSwitches["operator_gtorequal"] = [ + { + opcode: "operator_gt", + }, + noopSwitch, + { + opcode: "operator_lt", + }, + { + opcode: "operator_ltorequal", + }, + { + opcode: "operator_equals", + }, + { + opcode: "operator_notequal", + }, + ]; + blockSwitches["operator_ltorequal"] = [ + { + opcode: "operator_gt", + }, + { + opcode: "operator_gtorequal", + }, + { + opcode: "operator_lt", + }, + noopSwitch, + { + opcode: "operator_equals", + }, + { + opcode: "operator_notequal", + }, + ]; + blockSwitches["operator_add"] = [ + noopSwitch, + { + opcode: "operator_subtract", + }, + { + opcode: "operator_multiply", + }, + { + opcode: "operator_divide", + }, + { + opcode: "operator_power", + }, + { + opcode: "operator_mod", + }, + ]; + blockSwitches["operator_subtract"] = [ + { + opcode: "operator_add", + }, + noopSwitch, + { + opcode: "operator_multiply", + }, + { + opcode: "operator_divide", + }, + { + opcode: "operator_power", + }, + { + opcode: "operator_mod", + }, + ]; + blockSwitches["operator_multiply"] = [ + { + opcode: "operator_add", + }, + { + opcode: "operator_subtract", + }, + noopSwitch, + { + opcode: "operator_divide", + }, + { + opcode: "operator_power", + }, + { + opcode: "operator_mod", + }, + ]; + blockSwitches["operator_divide"] = [ + { + opcode: "operator_add", + }, + { + opcode: "operator_subtract", + }, + { + opcode: "operator_multiply", + }, + noopSwitch, + { + opcode: "operator_power", + }, + { + opcode: "operator_mod", + }, + ]; + blockSwitches["operator_power"] = [ + { + opcode: "operator_add", + }, + { + opcode: "operator_subtract", + }, + { + opcode: "operator_multiply", + }, + { + opcode: "operator_divide", + }, + noopSwitch, + { + opcode: "operator_mod", + }, + ]; + blockSwitches["operator_mod"] = [ + { + opcode: "operator_add", + }, + { + opcode: "operator_subtract", + }, + { + opcode: "operator_multiply", + }, + { + opcode: "operator_divide", + }, + { + opcode: "operator_power", + }, + noopSwitch, + ]; + blockSwitches["operator_and"] = [ + noopSwitch, + { + opcode: "operator_or", + }, + ]; + blockSwitches["operator_or"] = [ + { + opcode: "operator_and", + }, + noopSwitch, + ]; + blockSwitches["operator_trueBoolean"] = [ + noopSwitch, + { + opcode: "operator_falseBoolean", + }, + ]; + blockSwitches["operator_falseBoolean"] = [ + { + opcode: "operator_trueBoolean", + }, + noopSwitch, + ]; + } + + if (addon.settings.get("sensing")) { + blockSwitches["sensing_mousex"] = [ + noopSwitch, + { + opcode: "sensing_mousey", + }, + ]; + blockSwitches["sensing_mousey"] = [ + { + opcode: "sensing_mousex", + }, + noopSwitch, + ]; + blockSwitches["sensing_touchingcolor"] = [ + noopSwitch, + { + opcode: "sensing_coloristouchingcolor", + createInputs: { + COLOR2: { + shadowType: "colour_picker", + value: randomColor, + }, + }, + }, + ]; + blockSwitches["sensing_coloristouchingcolor"] = [ + { + opcode: "sensing_touchingcolor", + splitInputs: ["COLOR2"], + }, + noopSwitch, + ]; + } + + if (addon.settings.get("data")) { + blockSwitches["data_setvariableto"] = [ + noopSwitch, + { + opcode: "data_changevariableby", + remapShadowType: { VALUE: "math_number" }, + }, + ]; + blockSwitches["data_changevariableby"] = [ + { + opcode: "data_setvariableto", + remapShadowType: { VALUE: "text" }, + }, + noopSwitch, + ]; + blockSwitches["data_showvariable"] = [ + noopSwitch, + { + opcode: "data_hidevariable", + }, + ]; + blockSwitches["data_hidevariable"] = [ + { + opcode: "data_showvariable", + }, + noopSwitch, + ]; + blockSwitches["data_showlist"] = [ + noopSwitch, + { + opcode: "data_hidelist", + }, + ]; + blockSwitches["data_hidelist"] = [ + { + opcode: "data_showlist", + }, + noopSwitch, + ]; + blockSwitches["data_replaceitemoflist"] = [ + noopSwitch, + { + opcode: "data_insertatlist", + }, + ]; + blockSwitches["data_insertatlist"] = [ + { + opcode: "data_replaceitemoflist", + }, + noopSwitch, + ]; + blockSwitches["data_deleteoflist"] = [ + noopSwitch, + { + opcode: "data_deletealloflist", + splitInputs: ["INDEX"], + }, + ]; + blockSwitches["data_deletealloflist"] = [ + { + opcode: "data_deleteoflist", + createInputs: { + INDEX: { + shadowType: "math_integer", + value: "1", + }, + }, + }, + noopSwitch, + ]; + } + + if (addon.settings.get("extension")) { + blockSwitches["pen_penDown"] = [ + noopSwitch, + { + opcode: "pen_penUp", + }, + ]; + blockSwitches["pen_penUp"] = [ + { + opcode: "pen_penDown", + }, + noopSwitch, + ]; + blockSwitches["pen_setPenColorParamTo"] = [ + noopSwitch, + { + opcode: "pen_changePenColorParamBy", + }, + ]; + blockSwitches["pen_changePenColorParamBy"] = [ + { + opcode: "pen_setPenColorParamTo", + }, + noopSwitch, + ]; + blockSwitches["pen_setPenHueToNumber"] = [ + noopSwitch, + { + opcode: "pen_changePenHueBy", + }, + ]; + blockSwitches["pen_changePenHueBy"] = [ + { + opcode: "pen_setPenHueToNumber", + }, + noopSwitch, + ]; + blockSwitches["pen_setPenShadeToNumber"] = [ + noopSwitch, + { + opcode: "pen_changePenShadeBy", + }, + ]; + blockSwitches["pen_changePenShadeBy"] = [ + { + opcode: "pen_setPenShadeToNumber", + }, + noopSwitch, + ]; + blockSwitches["pen_setPenSizeTo"] = [ + noopSwitch, + { + opcode: "pen_changePenSizeBy", + }, + ]; + blockSwitches["pen_changePenSizeBy"] = [ + { + opcode: "pen_setPenSizeTo", + }, + noopSwitch, + ]; + blockSwitches["music_setTempo"] = [ + noopSwitch, + { + opcode: "music_changeTempo", + }, + ]; + blockSwitches["music_changeTempo"] = [ + { + opcode: "music_setTempo", + }, + noopSwitch, + ]; + + if (vm.extensionManager) { + const switches = vm.extensionManager.getAddonBlockSwitches(); + Object.getOwnPropertyNames(switches).forEach(extID => { + Object.getOwnPropertyNames(switches[extID]).forEach(block => { + blockSwitches[`${extID}_${block}`] = switches[extID][block]; + }) + }) + } + vm.runtime.on("EXTENSION_ADDED", () => { + const switches = vm.extensionManager.getAddonBlockSwitches(); + Object.getOwnPropertyNames(switches).forEach(extID => { + Object.getOwnPropertyNames(switches[extID]).forEach(block => { + blockSwitches[`${extID}_${block}`] = switches[extID][block]; + }) + }) + }) + } + + if (addon.settings.get("sa")) { + const logProc = "\u200B\u200Blog\u200B\u200B %s"; + const warnProc = "\u200B\u200Bwarn\u200B\u200B %s"; + const errorProc = "\u200B\u200Berror\u200B\u200B %s"; + const logMessage = msg("debugger_log"); + const warnMessage = msg("debugger_warn"); + const errorMessage = msg("debugger_error"); + const logSwitch = { + mutate: { + proccode: logProc, + }, + msg: logMessage, + }; + const warnSwitch = { + mutate: { + proccode: warnProc, + }, + msg: warnMessage, + }; + const errorSwitch = { + mutate: { + proccode: errorProc, + }, + msg: errorMessage, + }; + procedureSwitches[logProc] = [ + { + msg: logMessage, + isNoop: true, + }, + warnSwitch, + errorSwitch, + ]; + procedureSwitches[warnProc] = [ + logSwitch, + { + msg: warnMessage, + isNoop: true, + }, + errorSwitch, + ]; + procedureSwitches[errorProc] = [ + logSwitch, + warnSwitch, + { + msg: errorMessage, + isNoop: true, + }, + ]; + } + + // Switching for these is implemented by Scratch. We only define them here to optionally add a border. + // Because we don't implement the switching ourselves, this is not controlled by the data category option. + blockSwitches["data_variable"] = []; + blockSwitches["data_listcontents"] = []; + }; + buildSwitches(); + addon.settings.addEventListener("change", buildSwitches); + + /** + * @param {*} workspace + * @param {Element} xmlBlock + */ + const pasteBlockXML = (workspace, xmlBlock) => { + // Similar to https://github.com/LLK/scratch-blocks/blob/7575c9a0f2c267676569c4b102b76d77f35d9fd6/core/workspace_svg.js#L1020 + // but without the collision checking. + const block = ScratchBlocks.Xml.domToBlock(xmlBlock, workspace); + const x = +xmlBlock.getAttribute("x"); + const y = +xmlBlock.getAttribute("y"); + // Don't need to handle RTL here + block.moveBy(x, y); + return block; + }; + + /** + * @param {string} shadowType The type of shadow eg. "math_number" + * @returns {string} The name of the shadow's inner field that contains the user-visible value + */ + const getShadowFieldName = (shadowType) => { + // This is non-comprehensive. + if (shadowType === "text") { + return "TEXT"; + } + if (shadowType === "colour_picker") { + return "COLOUR"; + } + return "NUM"; + }; + + /** + * @template T + * @param {T|()=>T} value + * @returns {T} + */ + const callIfFunction = (value) => { + if (typeof value === "function") { + return value(); + } + return value; + }; + + const menuCallbackFactory = (block, opcodeData) => () => { + if (opcodeData.isNoop) { + return; + } + + if (opcodeData.fieldValue) { + block.setFieldValue(opcodeData.fieldValue, "VALUE"); + return; + } + + try { + ScratchBlocks.Events.setGroup(true); + + const workspace = block.workspace; + + const blocksToBringToForeground = []; + // Split inputs before we clone the block. + if (opcodeData.splitInputs) { + for (const inputName of opcodeData.splitInputs) { + const input = block.getInput(inputName); + if (!input) { + continue; + } + const connection = input.connection; + if (!connection) { + continue; + } + if (connection.isConnected()) { + const targetBlock = connection.targetBlock(); + if (targetBlock.isShadow()) { + // Deleting shadows is handled later. + } else { + connection.disconnect(); + blocksToBringToForeground.push(targetBlock); + } + } + } + } + + // Make a copy of the block with the proper type set. + // It doesn't seem to be possible to change a Block's type after it's created, so we'll just make a new block instead. + const xml = ScratchBlocks.Xml.blockToDom(block); + // blockToDomWithXY's handling of RTL is strange, so we encode the position ourselves. + const position = block.getRelativeToSurfaceXY(); + xml.setAttribute("x", position.x); + xml.setAttribute("y", position.y); + if (opcodeData.opcode) { + xml.setAttribute("type", opcodeData.opcode); + } + + const parentBlock = block.getParent(); + let parentConnection; + let blockConnectionType; + if (parentBlock) { + // If the block has a parent, find the parent -> child connection that will be reattached later. + const parentConnections = parentBlock.getConnections_(); + parentConnection = parentConnections.find( + (c) => c.targetConnection && c.targetConnection.sourceBlock_ === block + ); + // There's two types of connections from child -> parent. We need to figure out which one is used. + const blockConnections = block.getConnections_(); + const blockToParentConnection = blockConnections.find( + (c) => c.targetConnection && c.targetConnection.sourceBlock_ === parentBlock + ); + blockConnectionType = blockToParentConnection.type; + } + + // Array.from creates a clone of the children list. This is important as we may remove + // children as we iterate. + for (const child of Array.from(xml.children)) { + const oldName = child.getAttribute("name"); + + // Any inputs that were supposed to be split that were not should be removed. + // (eg. shadow inputs) + if (opcodeData.splitInputs && opcodeData.splitInputs.includes(oldName)) { + xml.removeChild(child); + continue; + } + + const newName = opcodeData.remapInputName && opcodeData.remapInputName[oldName]; + if (newName) { + child.setAttribute("name", newName); + } + + const newShadowType = opcodeData.remapShadowType && opcodeData.remapShadowType[oldName]; + if (newShadowType) { + const valueNode = child.firstChild; + const fieldNode = valueNode.firstChild; + valueNode.setAttribute("type", newShadowType); + fieldNode.setAttribute("name", getShadowFieldName(newShadowType)); + } + + const fieldValueMap = opcodeData.mapFieldValues && opcodeData.mapFieldValues[oldName]; + if (fieldValueMap && child.tagName === "FIELD") { + const oldValue = child.innerText; + const newValue = fieldValueMap[oldValue]; + if (typeof newValue === "string") { + child.innerText = newValue; + } + } + } + + if (opcodeData.mutate) { + const mutation = xml.querySelector("mutation"); + for (const [key, value] of Object.entries(opcodeData.mutate)) { + mutation.setAttribute(key, value); + } + } + + if (opcodeData.createInputs) { + for (const [inputName, inputData] of Object.entries(opcodeData.createInputs)) { + const valueElement = document.createElement("value"); + valueElement.setAttribute("name", inputName); + + const shadowElement = document.createElement("shadow"); + shadowElement.setAttribute("type", inputData.shadowType); + + const shadowFieldElement = document.createElement("field"); + shadowFieldElement.setAttribute("name", getShadowFieldName(inputData.shadowType)); + shadowFieldElement.innerText = callIfFunction(inputData.value); + + shadowElement.appendChild(shadowFieldElement); + valueElement.appendChild(shadowElement); + xml.appendChild(valueElement); + } + } + + // Remove the old block and insert the new one. + block.dispose(); + const newBlock = pasteBlockXML(workspace, xml); + + if (parentConnection) { + // Search for the same type of connection on the new block as on the old block. + const newBlockConnections = newBlock.getConnections_(); + const newBlockConnection = newBlockConnections.find((c) => c.type === blockConnectionType); + newBlockConnection.connect(parentConnection); + } + + for (const otherBlock of blocksToBringToForeground) { + // By re-appending the element, we move it to the end, which will make it display + // on top. + const svgRoot = otherBlock.getSvgRoot(); + svgRoot.parentNode.appendChild(svgRoot); + } + } finally { + ScratchBlocks.Events.setGroup(false); + } + }; + + const uniques = (array) => [...new Set(array)]; + + addon.tab.createBlockContextMenu( + (items, block) => { + if (!addon.self.disabled) { + const type = block.type; + let switches = blockSwitches[block.type] || []; + + const customArgsMode = addon.settings.get("customargs") ? addon.settings.get("customargsmode") : "off"; + if ( + customArgsMode !== "off" && + ["argument_reporter_boolean", "argument_reporter_string_number"].includes(type) && + // if the arg is a shadow, it's in a procedures_prototype so we don't want it to be switchable + !block.isShadow() + ) { + const customBlocks = getCustomBlocks(); + if (customArgsMode === "all") { + switch (type) { + case "argument_reporter_string_number": + switches = Object.values(customBlocks) + .map((cb) => cb.stringArgs) + .flat(1); + break; + case "argument_reporter_boolean": + switches = Object.values(customBlocks) + .map((cb) => cb.boolArgs) + .flat(1); + break; + } + } else if (customArgsMode === "defOnly") { + const root = block.getRootBlock(); + if (root.type !== "procedures_definition" || root.type !== "procedures_definition_return") return items; + const customBlockObj = customBlocks[root.getChildren(true)[0].getProcCode()]; + switch (type) { + case "argument_reporter_string_number": + switches = customBlockObj.stringArgs; + break; + case "argument_reporter_boolean": + switches = customBlockObj.boolArgs; + break; + } + } + const currentValue = block.getFieldValue("VALUE"); + switches = uniques(switches).map((i) => ({ + isNoop: i === currentValue, + fieldValue: i, + msg: i, + })); + } + + if (block.type === "procedures_call") { + const proccode = block.getProcCode(); + if (procedureSwitches[proccode]) { + switches = procedureSwitches[proccode]; + } + } + + if (!addon.settings.get("noop")) { + switches = switches.filter((i) => !i.isNoop); + } + + switches.forEach((opcodeData, i) => { + const makeSpaceItemIndex = items.findIndex((obj) => obj._isDevtoolsFirstItem); + const insertBeforeIndex = + makeSpaceItemIndex !== -1 + ? // If "make space" button exists, add own items before it + makeSpaceItemIndex + : // If there's no such button, insert at end + items.length; + const text = opcodeData.msg ? opcodeData.msg : opcodeData.opcode ? msg(opcodeData.opcode) : msg(block.type); + items.splice(insertBeforeIndex, 0, { + enabled: true, + text, + callback: menuCallbackFactory(block, opcodeData), + separator: i === 0, + }); + }); + + if (block.type === "data_variable" || block.type === "data_listcontents") { + // Add top border to first variable (if it exists) + const delBlockIndex = items.findIndex((item) => item.text === ScratchBlocks.Msg.DELETE_BLOCK); + // firstVariableItem might be undefined, a variable to switch to, + // or an item added by editor-devtools (or any addon before this one) + const firstVariableItem = items[delBlockIndex + 1]; + if (firstVariableItem) firstVariableItem.separator = true; + } + } + return items; + }, + { blocks: true } + ); + + // https://github.com/LLK/scratch-blocks/blob/abbfe93136fef57fdfb9a077198b0bc64726f012/blocks_vertical/procedures.js#L207-L215 + // Returns a list like ["%s", "%d"] + const parseArguments = (code) => + code + .split(/(?=[^\\]%[nbs])/g) + .map((i) => i.trim()) + .filter((i) => i.charAt(0) === "%") + .map((i) => i.substring(0, 2)); + + const getCustomBlocks = () => { + const customBlocks = {}; + const target = vm.editingTarget; + Object.values(target.blocks._blocks) + .filter((block) => block.opcode === "procedures_prototype") + .forEach((block) => { + const procCode = block.mutation.proccode; + const argumentNames = JSON.parse(block.mutation.argumentnames); + // argumentdefaults is unreliable, so we have to parse the procedure code to determine argument types + const parsedArguments = parseArguments(procCode); + const stringArgs = []; + const boolArgs = []; + for (let i = 0; i < argumentNames.length; i++) { + if (parsedArguments[i] === "%b") { + boolArgs.push(argumentNames[i]); + } else { + stringArgs.push(argumentNames[i]); + } + } + customBlocks[procCode] = { + stringArgs, + boolArgs, + }; + }); + return customBlocks; + }; +} diff --git a/src/addons/addons/blocks2image/_manifest_entry.js b/src/addons/addons/blocks2image/_manifest_entry.js new file mode 100644 index 0000000000000000000000000000000000000000..e430c76deebca33099cf2ed8ecffde918d5f88bc --- /dev/null +++ b/src/addons/addons/blocks2image/_manifest_entry.js @@ -0,0 +1,20 @@ +/* generated by pull.js */ +const manifest = { + "editorOnly": true, + "name": "Save blocks as image", + "description": "Right click the code area to export blocks as SVG/PNG images.", + "tags": [], + "credits": [ + { + "name": "summerscar" + } + ], + "dynamicDisable": true, + "userscripts": [ + { + "url": "userscript.js" + } + ], + "enabledByDefault": true +}; +export default manifest; diff --git a/src/addons/addons/blocks2image/_runtime_entry.js b/src/addons/addons/blocks2image/_runtime_entry.js new file mode 100644 index 0000000000000000000000000000000000000000..bc67131957e52185c142f348760610cfaa4f774d --- /dev/null +++ b/src/addons/addons/blocks2image/_runtime_entry.js @@ -0,0 +1,5 @@ +/* generated by pull.js */ +import _js from "./userscript.js"; +export const resources = { + "userscript.js": _js, +}; diff --git a/src/addons/addons/blocks2image/userscript.js b/src/addons/addons/blocks2image/userscript.js new file mode 100644 index 0000000000000000000000000000000000000000..b0b19f726aafc24c5ada2ebd6018f13b030502a9 --- /dev/null +++ b/src/addons/addons/blocks2image/userscript.js @@ -0,0 +1,279 @@ +export default async function ({ addon, console, msg }) { + function makeStyle() { + let style = document.createElement("style"); + style.textContent = ` + .blocklyText { + fill: #fff; + font-family: "Helvetica Neue", Helvetica, sans-serif; + font-size: 12pt; + font-weight: 500; + } + .blocklyNonEditableText>text, .blocklyEditableText>text { + fill: #575E75; + } + .blocklyDropdownText { + fill: #fff !important; + } + `; + for (let userstyle of document.querySelectorAll(".scratch-addons-style[data-addons*='editor-theme3']")) { + if (userstyle.disabled) continue; + style.textContent += userstyle.textContent; + } + return style; + } + + function setCSSVars(element) { + for (let property of document.documentElement.style) { + if (property.startsWith("--editorTheme3-")) + element.style.setProperty(property, document.documentElement.style.getPropertyValue(property)); + } + } + + let exSVG = document.createElementNS("http://www.w3.org/2000/svg", "svg"); + exSVG.setAttribute("xmlns:html", "http://www.w3.org/1999/xhtml"); + exSVG.setAttribute("xmlns:xlink", "http://www.w3.org/1999/xlink"); + exSVG.setAttribute("version", "1.1"); + + // blocks-media as base64 for svg inline image + let blocksMedia = new Map(); + blocksMedia.set( + "repeat.svg", + "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDIxLjAuMCwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPgo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9InJlcGVhdCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeD0iMHB4IiB5PSIwcHgiCgkgdmlld0JveD0iMCAwIDI0IDI0IiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCAyNCAyNDsiIHhtbDpzcGFjZT0icHJlc2VydmUiPgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJLnN0MHtmaWxsOiNDRjhCMTc7fQoJLnN0MXtmaWxsOiNGRkZGRkY7fQo8L3N0eWxlPgo8dGl0bGU+cmVwZWF0PC90aXRsZT4KPHBhdGggY2xhc3M9InN0MCIgZD0iTTIzLjMsMTFjLTAuMywwLjYtMC45LDEtMS41LDFoLTEuNmMtMC4xLDEuMy0wLjUsMi41LTEuMSwzLjZjLTAuOSwxLjctMi4zLDMuMi00LjEsNC4xCgljLTEuNywwLjktMy42LDEuMi01LjUsMC45Yy0xLjgtMC4zLTMuNS0xLjEtNC45LTIuM2MtMC43LTAuNy0wLjctMS45LDAtMi42YzAuNi0wLjYsMS42LTAuNywyLjMtMC4ySDdjMC45LDAuNiwxLjksMC45LDIuOSwwLjkKCXMxLjktMC4zLDIuNy0wLjljMS4xLTAuOCwxLjgtMi4xLDEuOC0zLjVoLTEuNWMtMC45LDAtMS43LTAuNy0xLjctMS43YzAtMC40LDAuMi0wLjksMC41LTEuMmw0LjQtNC40YzAuNy0wLjYsMS43LTAuNiwyLjQsMEwyMyw5LjIKCUMyMy41LDkuNywyMy42LDEwLjQsMjMuMywxMXoiLz4KPHBhdGggY2xhc3M9InN0MSIgZD0iTTIxLjgsMTFoLTIuNmMwLDEuNS0wLjMsMi45LTEsNC4yYy0wLjgsMS42LTIuMSwyLjgtMy43LDMuNmMtMS41LDAuOC0zLjMsMS4xLTQuOSwwLjhjLTEuNi0wLjItMy4yLTEtNC40LTIuMQoJYy0wLjQtMC4zLTAuNC0wLjktMC4xLTEuMmMwLjMtMC40LDAuOS0wLjQsMS4yLTAuMWwwLDBjMSwwLjcsMi4yLDEuMSwzLjQsMS4xczIuMy0wLjMsMy4zLTFjMC45LTAuNiwxLjYtMS41LDItMi42CgljMC4zLTAuOSwwLjQtMS44LDAuMi0yLjhoLTIuNGMtMC40LDAtMC43LTAuMy0wLjctMC43YzAtMC4yLDAuMS0wLjMsMC4yLTAuNGw0LjQtNC40YzAuMy0wLjMsMC43LTAuMywwLjksMEwyMiw5LjgKCWMwLjMsMC4zLDAuNCwwLjYsMC4zLDAuOVMyMiwxMSwyMS44LDExeiIvPgo8L3N2Zz4K" + ); + blocksMedia.set( + "green-flag.svg", + "data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwLDAsNjkuNDM1MTQsODEuODUzNjEiIGhlaWdodD0iODEuODUzNjEiIHdpZHRoPSI2OS40MzUxNCIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmVyc2lvbj0iMS4xIj48ZGVmcz48bGluZWFyR3JhZGllbnQgaWQ9ImNvbG9yLTEiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB5Mj0iMTkxLjg0MTM3IiB4Mj0iMjQwLjA3NDA0IiB5MT0iMTQxLjE1MDkyIiB4MT0iMjQwLjA3NDA0Ij48c3RvcCBzdG9wLWNvbG9yPSIjMDBhNWZmIiBvZmZzZXQ9IjAiPjwvc3RvcD48c3RvcCBzdG9wLWNvbG9yPSIjMDA2NWZmIiBvZmZzZXQ9IjEiPjwvc3RvcD48L2xpbmVhckdyYWRpZW50PjwvZGVmcz48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjA0Ljc4MjQzLC0xMzkuNDk1NDcpIj48ZyBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6IG5vcm1hbCIgc3Ryb2tlLWRhc2hvZmZzZXQ9IjAiIHN0cm9rZS1kYXNoYXJyYXk9IiIgc3Ryb2tlLW1pdGVybGltaXQ9IjEwIiBzdHJva2UtbGluZWpvaW49Im1pdGVyIiBzdHJva2U9IiMwMDMxNmIiIGZpbGwtcnVsZT0ibm9uemVybyIgZGF0YS1wYXBlci1kYXRhPSJ7JnF1b3Q7aXNQYWludGluZ0xheWVyJnF1b3Q7OnRydWV9Ij48cGF0aCBzdHJva2UtbGluZWNhcD0iYnV0dCIgc3Ryb2tlLXdpZHRoPSIzIiBmaWxsPSJ1cmwoI2NvbG9yLTEpIiBkPSJNMjA3LjQzMDUyLDE4Ny4yNjY0MnYtNDIuNDU1NTRjMCwwIDcuNDUwMDgsLTMuNjU5OTYgMTUuODExNzEsLTMuNjU5OTZjOC45ODk3MywwIDI1LjQ3NjM1LDguMjM0OTEgMzMuODMzNjYsOC4yMzQ5MWM4LjI5MjM0LDAgMTUuNjQxNjksLTQuNTc0OTUgMTUuNjQxNjksLTQuNTc0OTV2NDIuNDU1NTRjMCwwIC03LjM3NzI1LDQuNTc0OTUgLTE1LjY0MTY5LDQuNTc0OTVjLTcuNTEwNzcsMCAtMjQuNTc4NzMsLTguMjM0OTEgLTMyLjk4MzU3LC04LjIzNDkxYy04LjczMDY1LDAgLTE2LjY2MTgsMy42NTk5NiAtMTYuNjYxOCwzLjY1OTk2eiI+PC9wYXRoPjxwYXRoIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSI1IiBmaWxsPSJub25lIiBkPSJNMjA3LjI4MjQ0LDIxOC44NDkwOHYtNzYuODUzNjEiPjwvcGF0aD48L2c+PC9nPjwvc3ZnPjwhLS1yb3RhdGlvbkNlbnRlcjozNS4yMTc1NjUwMDAwMDAwMTo0MC41MDQ1Mjk5OTk5OTk5OS0tPg==" + ); + blocksMedia.set( + "blue-flag.svg", + "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDIxLjAuMCwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPgo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9ImdyZWVuZmxhZyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeD0iMHB4IiB5PSIwcHgiCgkgdmlld0JveD0iMCAwIDI0IDI0IiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCAyNCAyNDsiIHhtbDpzcGFjZT0icHJlc2VydmUiPgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJLnN0MHtmaWxsOiM0NTk5M0Q7fQoJLnN0MXtmaWxsOiM0Q0JGNTY7fQo8L3N0eWxlPgo8dGl0bGU+Z3JlZW5mbGFnPC90aXRsZT4KPHBhdGggY2xhc3M9InN0MCIgZD0iTTIwLjgsMy43Yy0wLjQtMC4yLTAuOS0wLjEtMS4yLDAuMmMtMiwxLjYtNC44LDEuNi02LjgsMGMtMi4zLTEuOS01LjYtMi4zLTguMy0xVjIuNWMwLTAuNi0wLjUtMS0xLTEKCXMtMSwwLjQtMSwxdjE4LjhjMCwwLjUsMC41LDEsMSwxaDAuMWMwLjUsMCwxLTAuNSwxLTF2LTYuNGMxLTAuNywyLjEtMS4yLDMuNC0xLjNjMS4yLDAsMi40LDAuNCwzLjQsMS4yYzIuOSwyLjMsNywyLjMsOS44LDAKCWMwLjMtMC4yLDAuNC0wLjUsMC40LTAuOVY0LjdDMjEuNiw0LjIsMjEuMywzLjgsMjAuOCwzLjd6IE0yMC41LDEzLjlDMjAuNSwxMy45LDIwLjUsMTMuOSwyMC41LDEzLjlDMTgsMTYsMTQuNCwxNiwxMS45LDE0CgljLTEuMS0wLjktMi41LTEuNC00LTEuNGMtMS4yLDAuMS0yLjMsMC41LTMuNCwxLjFWNEM3LDIuNiwxMCwyLjksMTIuMiw0LjZjMi40LDEuOSw1LjcsMS45LDguMSwwYzAuMSwwLDAuMSwwLDAuMiwwCgljMCwwLDAuMSwwLjEsMC4xLDAuMUwyMC41LDEzLjl6Ii8+CjxwYXRoIGNsYXNzPSJzdDEiIGQ9Ik0yMC42LDQuOGwtMC4xLDkuMWMwLDAsMCwwLjEsMCwwLjFjLTIuNSwyLTYuMSwyLTguNiwwYy0xLjEtMC45LTIuNS0xLjQtNC0xLjRjLTEuMiwwLjEtMi4zLDAuNS0zLjQsMS4xVjQKCUM3LDIuNiwxMCwyLjksMTIuMiw0LjZjMi40LDEuOSw1LjcsMS45LDguMSwwYzAuMSwwLDAuMSwwLDAuMiwwQzIwLjUsNC43LDIwLjYsNC43LDIwLjYsNC44eiIvPgo8L3N2Zz4K" + ); + blocksMedia.set( + "control_stop.svg", + "data:image/svg+xml;base64,PHN2ZyBpZD0iSWNvbiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgNDAgNDAiPjx0aXRsZT5jb250cm9sX3N0b3A8L3RpdGxlPjxwb2x5Z29uIHBvaW50cz0iMjUuNjEgNi41IDMzLjU2IDE0LjQ0IDMzLjU2IDI1LjY4IDI1LjYxIDMzLjYyIDE0LjM4IDMzLjYyIDYuNDMgMjUuNjggNi40MyAxNC40NCAxNC4zOCA2LjUgMjUuNjEgNi41IiBmaWxsPSIjZWM1ODU4IiBzdHJva2U9IiNiNjQ2NDYiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPjwvc3ZnPg==" + ); + blocksMedia.set( + "rotate-left.svg", + "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48c3ZnIGlkPSJyb3RhdGUtY2xvY2t3aXNlIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHN0eWxlPi5jbHMtMXtmaWxsOiMzZDc5Y2M7fS5jbHMtMntmaWxsOiNmZmY7fTwvc3R5bGU+PHRpdGxlPnJvdGF0ZS1jbG9ja3dpc2U8L3RpdGxlPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTIwLjM0LDE4LjIxYTEwLjI0LDEwLjI0LDAsMCwxLTguMSw0LjIyLDIuMjYsMi4yNiwwLDAsMS0uMTYtNC41MmgwYTUuNTgsNS41OCwwLDAsMCw0LjI1LTIuNTMsNS4wNiw1LjA2LDAsMCwwLC41NC00LjYyQTQuMjUsNC4yNSwwLDAsMCwxNS41NSw5YTQuMzEsNC4zMSwwLDAsMC0yLS44QTQuODIsNC44MiwwLDAsMCwxMC40LDlsMS4xMiwxLjQxQTEuNTksMS41OSwwLDAsMSwxMC4zNiwxM0gyLjY3YTEuNTYsMS41NiwwLDAsMS0xLjI2LS42M0ExLjU0LDEuNTQsMCwwLDEsMS4xMywxMUwyLjg1LDMuNTdBMS41OSwxLjU5LDAsMCwxLDQuMzgsMi40LDEuNTcsMS41NywwLDAsMSw1LjYyLDNMNi43LDQuMzVhMTAuNjYsMTAuNjYsMCwwLDEsNy43Mi0xLjY4QTkuODgsOS44OCwwLDAsMSwxOSw0LjgxLDkuNjEsOS42MSwwLDAsMSwyMS44Myw5LDEwLjA4LDEwLjA4LDAsMCwxLDIwLjM0LDE4LjIxWiIvPjxwYXRoIGNsYXNzPSJjbHMtMiIgZD0iTTE5LjU2LDE3LjY1YTkuMjksOS4yOSwwLDAsMS03LjM1LDMuODMsMS4zMSwxLjMxLDAsMCwxLS4wOC0yLjYyLDYuNTMsNi41MywwLDAsMCw1LTIuOTIsNi4wNSw2LjA1LDAsMCwwLC42Ny01LjUxLDUuMzIsNS4zMiwwLDAsMC0xLjY0LTIuMTYsNS4yMSw1LjIxLDAsMCwwLTIuNDgtMUE1Ljg2LDUuODYsMCwwLDAsOSw4Ljg0TDEwLjc0LDExYS41OS41OSwwLDAsMS0uNDMsMUgyLjdhLjYuNiwwLDAsMS0uNi0uNzVMMy44MSwzLjgzYS41OS41OSwwLDAsMSwxLS4yMWwxLjY3LDIuMWE5LjcxLDkuNzEsMCwwLDEsNy43NS0yLjA3LDguODQsOC44NCwwLDAsMSw0LjEyLDEuOTIsOC42OCw4LjY4LDAsMCwxLDIuNTQsMy43MkE5LjE0LDkuMTQsMCwwLDEsMTkuNTYsMTcuNjVaIi8+PC9zdmc+" + ); + blocksMedia.set( + "rotate-right.svg", + "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48c3ZnIGlkPSJyb3RhdGUtY291bnRlci1jbG9ja3dpc2UiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDI0IDI0Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6IzNkNzljYzt9LmNscy0ye2ZpbGw6I2ZmZjt9PC9zdHlsZT48L2RlZnM+PHRpdGxlPnJvdGF0ZS1jb3VudGVyLWNsb2Nrd2lzZTwvdGl0bGU+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMjIuNjgsMTIuMmExLjYsMS42LDAsMCwxLTEuMjcuNjNIMTMuNzJhMS41OSwxLjU5LDAsMCwxLTEuMTYtMi41OGwxLjEyLTEuNDFhNC44Miw0LjgyLDAsMCwwLTMuMTQtLjc3LDQuMzEsNC4zMSwwLDAsMC0yLC44LDQuMjUsNC4yNSwwLDAsMC0xLjM0LDEuNzMsNS4wNiw1LjA2LDAsMCwwLC41NCw0LjYyQTUuNTgsNS41OCwwLDAsMCwxMiwxNy43NGgwYTIuMjYsMi4yNiwwLDAsMS0uMTYsNC41MkExMC4yNSwxMC4yNSwwLDAsMSwzLjc0LDE4LDEwLjE0LDEwLjE0LDAsMCwxLDIuMjUsOC43OCw5LjcsOS43LDAsMCwxLDUuMDgsNC42NCw5LjkyLDkuOTIsMCwwLDEsOS42NiwyLjVhMTAuNjYsMTAuNjYsMCwwLDEsNy43MiwxLjY4bDEuMDgtMS4zNWExLjU3LDEuNTcsMCwwLDEsMS4yNC0uNiwxLjYsMS42LDAsMCwxLDEuNTQsMS4yMWwxLjcsNy4zN0ExLjU3LDEuNTcsMCwwLDEsMjIuNjgsMTIuMloiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0yMS4zOCwxMS44M0gxMy43N2EuNTkuNTksMCwwLDEtLjQzLTFsMS43NS0yLjE5YTUuOSw1LjksMCwwLDAtNC43LTEuNTgsNS4wNyw1LjA3LDAsMCwwLTQuMTEsMy4xN0E2LDYsMCwwLDAsNywxNS43N2E2LjUxLDYuNTEsMCwwLDAsNSwyLjkyLDEuMzEsMS4zMSwwLDAsMS0uMDgsMi42Miw5LjMsOS4zLDAsMCwxLTcuMzUtMy44MkE5LjE2LDkuMTYsMCwwLDEsMy4xNyw5LjEyLDguNTEsOC41MSwwLDAsMSw1LjcxLDUuNCw4Ljc2LDguNzYsMCwwLDEsOS44MiwzLjQ4YTkuNzEsOS43MSwwLDAsMSw3Ljc1LDIuMDdsMS42Ny0yLjFhLjU5LjU5LDAsMCwxLDEsLjIxTDIyLDExLjA4QS41OS41OSwwLDAsMSwyMS4zOCwxMS44M1oiLz48L3N2Zz4=" + ); + blocksMedia.set( + "dropdown-arrow.svg", + "data:image/svg+xml;base64,PHN2ZyBpZD0iTGF5ZXJfMSIgZGF0YS1uYW1lPSJMYXllciAxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMi43MSIgaGVpZ2h0PSI4Ljc5IiB2aWV3Qm94PSIwIDAgMTIuNzEgOC43OSI+PHRpdGxlPmRyb3Bkb3duLWFycm93PC90aXRsZT48ZyBvcGFjaXR5PSIwLjEiPjxwYXRoIGQ9Ik0xMi43MSwyLjQ0QTIuNDEsMi40MSwwLDAsMSwxMiw0LjE2TDguMDgsOC4wOGEyLjQ1LDIuNDUsMCwwLDEtMy40NSwwTDAuNzIsNC4xNkEyLjQyLDIuNDIsMCwwLDEsMCwyLjQ0LDIuNDgsMi40OCwwLDAsMSwuNzEuNzFDMSwwLjQ3LDEuNDMsMCw2LjM2LDBTMTEuNzUsMC40NiwxMiwuNzFBMi40NCwyLjQ0LDAsMCwxLDEyLjcxLDIuNDRaIiBmaWxsPSIjMjMxZjIwIi8+PC9nPjxwYXRoIGQ9Ik02LjM2LDcuNzlhMS40MywxLjQzLDAsMCwxLTEtLjQyTDEuNDIsMy40NWExLjQ0LDEuNDQsMCwwLDEsMC0yYzAuNTYtLjU2LDkuMzEtMC41Niw5Ljg3LDBhMS40NCwxLjQ0LDAsMCwxLDAsMkw3LjM3LDcuMzdBMS40MywxLjQzLDAsMCwxLDYuMzYsNy43OVoiIGZpbGw9IiNmZmYiLz48L3N2Zz4=" + ); + + addon.tab.createBlockContextMenu( + (items) => { + if (addon.self.disabled) return items; + let svgchild = document.querySelector("svg.blocklySvg g.blocklyBlockCanvas"); + + const pasteItemIndex = items.findIndex((obj) => obj._isDevtoolsFirstItem); + const insertBeforeIndex = + pasteItemIndex !== -1 + ? // If "paste" button exists, add own items before it + pasteItemIndex + : // If there's no such button, insert at end + items.length; + + items.splice( + insertBeforeIndex, + 0, + { + enabled: !!svgchild?.childNodes?.length, + text: msg("export_all_to_SVG"), + callback: () => { + exportBlock(false); + }, + separator: true, + }, + { + enabled: !!svgchild?.childNodes?.length, + text: msg("export_all_to_PNG"), + callback: () => { + exportBlock(true); + }, + separator: false, + } + ); + + return items; + }, + { workspace: true } + ); + addon.tab.createBlockContextMenu( + (items, block) => { + if (addon.self.disabled) return items; + const makeSpaceItemIndex = items.findIndex((obj) => obj._isDevtoolsFirstItem); + const insertBeforeIndex = + makeSpaceItemIndex !== -1 + ? // If "make space" button exists, add own items before it + makeSpaceItemIndex + : // If there's no such button, insert at end + items.length; + + items.splice( + insertBeforeIndex, + 0, + { + enabled: true, + text: msg("export_selected_to_SVG"), + callback: () => { + exportBlock(false, block); + }, + separator: true, + }, + { + enabled: true, + text: msg("export_selected_to_PNG"), + callback: () => { + exportBlock(true, block); + }, + separator: false, + } + ); + + return items; + }, + { blocks: true } + ); + + function exportBlock(isExportPNG, block) { + let svg; + if (block) { + svg = selectedBlocks(isExportPNG, block); + } else { + svg = allBlocks(isExportPNG); + } + // resolve nbsp whitespace + svg.querySelectorAll("text").forEach((text) => { + text.innerHTML = text.innerHTML.replace(/ /g, " "); + }); + // resolve image path + let scratchURL = window.location.origin; + + svg.querySelectorAll("image").forEach((item) => { + let builtinSvgData = blocksMedia.get( + item.getAttribute("xlink:href").substring(item.getAttribute("xlink:href").lastIndexOf("/") + 1) + ); + if (builtinSvgData) { + // replace svg file path (official) to inline svg + item.setAttribute("xlink:href", builtinSvgData); + } else if (item.getAttribute("xlink:href").indexOf("/static/") === 0) { + // replace link path for third party website + item.setAttribute("xlink:href", scratchURL + item.getAttribute("xlink:href").slice(0)); + } else if (item.getAttribute("xlink:href").indexOf("./static/") === 0) { + item.setAttribute("xlink:href", scratchURL + item.getAttribute("xlink:href").slice(1)); + } else if (item.getAttribute("xlink:href").indexOf("static/") === 0) { + item.setAttribute("xlink:href", scratchURL + "/" + item.getAttribute("xlink:href")); + } + }); + if (!isExportPNG) { + exportData(new XMLSerializer().serializeToString(svg)); + } else { + exportPNG(svg); + } + } + + function selectedBlocks(isExportPNG, block) { + let svg = exSVG.cloneNode(); + + let svgchild = block.svgGroup_; + svgchild = svgchild.cloneNode(true); + let dataShapes = svgchild.getAttribute("data-shapes"); + svgchild.setAttribute( + "transform", + `translate(0,${dataShapes === "hat" ? "18" : "0"}) ${isExportPNG ? "scale(2)" : ""}` + ); + setCSSVars(svg); + svg.append(makeStyle()); + svg.append(svgchild); + return svg; + } + + function allBlocks(isExportPNG) { + let svg = exSVG.cloneNode(); + + let svgchild = document.querySelector("svg.blocklySvg g.blocklyBlockCanvas"); + svgchild = svgchild.cloneNode(true); + + let xArr = []; + let yArr = []; + + svgchild.childNodes.forEach((g) => { + let x = g.getAttribute("transform").match(/translate\((.*?),(.*?)\)/)[1] || 0; + let y = g.getAttribute("transform").match(/translate\((.*?),(.*?)\)/)[2] || 0; + xArr.push(x * (isExportPNG ? 2 : 1)); + yArr.push(y * (isExportPNG ? 2 : 1)); + g.style.display = ""; // because of TW scratch-blocks changes + }); + + svgchild.setAttribute( + "transform", + `translate(${-Math.min(...xArr)},${-Math.min(...yArr) + 18 * (isExportPNG ? 2 : 1)}) ${ + isExportPNG ? "scale(2)" : "" + }` + ); + setCSSVars(svg); + svg.append(makeStyle()); + svg.append(svgchild); + return svg; + } + + function exportData(text) { + const saveLink = document.createElement("a"); + document.body.appendChild(saveLink); + + const data = new Blob([text], { type: "text" }); + const url = window.URL.createObjectURL(data); + saveLink.href = url; + + // File name: project-DATE-TIME + const date = new Date(); + const timestamp = `${date.toLocaleDateString()}-${date.toLocaleTimeString()}`; + saveLink.download = `block_${timestamp}.svg`; + saveLink.click(); + window.URL.revokeObjectURL(url); + document.body.removeChild(saveLink); + } + + function exportPNG(svg) { + const serializer = new XMLSerializer(); + + const iframe = document.createElement("iframe"); + // iframe.style.display = "none" + document.body.append(iframe); + iframe.contentDocument.write(serializer.serializeToString(svg)); + let { width, height } = iframe.contentDocument.body.querySelector("svg g").getBoundingClientRect(); + height = height + 20 * 2; // hat block height restore + svg.setAttribute("width", width + "px"); + svg.setAttribute("height", height + "px"); + + let canvas = document.createElement("canvas"); + let ctx = canvas.getContext("2d"); + + let img = document.createElement("img"); + + img.setAttribute( + "src", + "data:image/svg+xml;base64," + btoa(unescape(encodeURIComponent(serializer.serializeToString(svg)))) + ); + img.onload = function () { + canvas.height = img.height; + canvas.width = img.width; + ctx.drawImage(img, 0, 0, img.width, img.height); + // Now is done + let dataURL = canvas.toDataURL("image/png"); + let link = document.createElement("a"); + const date = new Date(); + const timestamp = `${date.toLocaleDateString()}-${date.toLocaleTimeString()}`; + + link.download = `block_${timestamp}.png`; + link.href = dataURL; + link.click(); + iframe.remove(); + }; + } +} diff --git a/src/addons/addons/cat-blocks/_manifest_entry.js b/src/addons/addons/cat-blocks/_manifest_entry.js new file mode 100644 index 0000000000000000000000000000000000000000..17b1e0199260ad041f654df6cc22d2b29e1e644d --- /dev/null +++ b/src/addons/addons/cat-blocks/_manifest_entry.js @@ -0,0 +1,41 @@ +/* generated by pull.js */ +const manifest = { + "editorOnly": true, + "noTranslations": true, + "name": "Cat blocks", + "description": "Brings back editor cat hat blocks from April Fools 2020.", + "credits": [ + { + "name": "TheColaber", + "link": "https://scratch.mit.edu/users/TheColaber/" + }, + { + "name": "GarboMuffin" + } + ], + "userscripts": [ + { + "url": "userscript.js" + } + ], + "info": [ + { + "type": "notice", + "text": "The \"watch mouse cursor\" setting may impact performance when the editor is open.", + "id": "watch" + } + ], + "settings": [ + { + "id": "watch", + "name": "Watch mouse cursor", + "default": false, + "type": "boolean" + } + ], + "tags": [ + "theme" + ], + "enabledByDefault": true +}; +export default manifest; diff --git a/src/addons/addons/cat-blocks/_runtime_entry.js b/src/addons/addons/cat-blocks/_runtime_entry.js new file mode 100644 index 0000000000000000000000000000000000000000..bc67131957e52185c142f348760610cfaa4f774d --- /dev/null +++ b/src/addons/addons/cat-blocks/_runtime_entry.js @@ -0,0 +1,5 @@ +/* generated by pull.js */ +import _js from "./userscript.js"; +export const resources = { + "userscript.js": _js, +}; diff --git a/src/addons/addons/cat-blocks/userscript.js b/src/addons/addons/cat-blocks/userscript.js new file mode 100644 index 0000000000000000000000000000000000000000..4f6bde68dd80ba52e5352c7c56064c8d9f17f01b --- /dev/null +++ b/src/addons/addons/cat-blocks/userscript.js @@ -0,0 +1,345 @@ +/** + * Based on https://github.com/LLK/scratch-blocks/compare/hotfix/totally-normal-2021 (Apache 2.0) + * It has been modified to work properly in our environment and fix some bugs. + */ + +export default async function ({ addon, console }) { + const Blockly = await addon.tab.traps.getBlockly(); + + const shouldWatchMouseCursor = addon.settings.get("watch"); + + Blockly.BlockSvg.START_HAT_HEIGHT = 31; + + Blockly.BlockSvg.START_HAT_PATH = + "c2.6,-2.3 5.5,-4.3 8.5,-6.2" + + "c-1,-12.5 5.3,-23.3 8.4,-24.8c3.7,-1.8 16.5,13.1 18.4,15.4" + + "c8.4,-1.3 17,-1.3 25.4,0c1.9,-2.3 14.7,-17.2 18.4,-15.4" + + "c3.1,1.5 9.4,12.3 8.4,24.8c3,1.8 5.9,3.9 8.5,6.1"; + + Blockly.BlockSvg.TOP_LEFT_CORNER_DEFINE_HAT = + "c0,-7.1 3.7,-13.3 9.3,-16.9c1.7,-7.5 5.4,-13.2 7.6,-14.2" + + "c2.6,-1.3 10,6 14.6,11.1h33c4.6,-5.1 11.9,-12.4 14.6,-11.1" + + "c1.9,0.9 4.9,5.2 6.8,11.1c2.6,0,5.2,0,7.8,0"; + + Blockly.BlockSvg.prototype.renderCatFace_ = function () { + this.catPath_.svgFace.setAttribute("fill", "#000000"); + + var closedEye = Blockly.utils.createSvgElement("path", {}, this.svgFace_); + closedEye.setAttribute( + "d", + "M25.2-1.1c0.1,0,0.2,0,0.2,0l8.3-2.1l-7-4.8" + + "c-0.5-0.3-1.1-0.2-1.4,0.3s-0.2,1.1,0.3,1.4L29-4.1l-4,1" + + "c-0.5,0.1-0.9,0.7-0.7,1.2C24.3-1.4,24.7-1.1,25.2-1.1z" + ); + closedEye.setAttribute("fill-opacity", "0"); + this.catPath_.svgFace.closedEye = closedEye; + + var closedEye2 = Blockly.utils.createSvgElement("path", {}, this.svgFace_); + closedEye2.setAttribute( + "d", + "M62.4-1.1c-0.1,0-0.2,0-0.2,0l-8.3-2.1l7-4.8" + + "c0.5-0.3,1.1-0.2,1.4,0.3s0.2,1.1-0.3,1.4l-3.4,2.3l4,1" + + "c0.5,0.1,0.9,0.7,0.7,1.2C63.2-1.4,62.8-1.1,62.4-1.1z" + ); + closedEye2.setAttribute("fill-opacity", "0"); + this.catPath_.svgFace.closedEye2 = closedEye2; + + var eye = Blockly.utils.createSvgElement("circle", {}, this.svgFace_); + eye.setAttribute("cx", "59.2"); + eye.setAttribute("cy", "-3.3"); + eye.setAttribute("r", "3.4"); + eye.setAttribute("fill-opacity", "0.6"); + this.catPath_.svgFace.eye = eye; + + var eye2 = Blockly.utils.createSvgElement("circle", {}, this.svgFace_); + eye2.setAttribute("cx", "29.1"); + eye2.setAttribute("cy", "-3.3"); + eye2.setAttribute("r", "3.4"); + eye2.setAttribute("fill-opacity", "0.6"); + this.catPath_.svgFace.eye2 = eye2; + + var mouth = Blockly.utils.createSvgElement("path", {}, this.svgFace_); + mouth.setAttribute( + "d", + "M45.6,0.1c-0.9,0-1.7-0.3-2.3-0.9" + + "c-0.6,0.6-1.3,0.9-2.2,0.9c-0.9,0-1.8-0.3-2.3-0.9c-1-1.1-1.1-2.6-1.1-2.8" + + "c0-0.5,0.5-1,1-1l0,0c0.6,0,1,0.5,1,1c0,0.4,0.1,1.7,1.4,1.7" + + "c0.5,0,0.7-0.2,0.8-0.3c0.3-0.3,0.4-1,0.4-1.3c0-0.1,0-0.1,0-0.2" + + "c0-0.5,0.5-1,1-1l0,0c0.5,0,1,0.4,1,1c0,0,0,0.1,0,0.2" + + "c0,0.3,0.1,0.9,0.4,1.2C44.8-2.2,45-2,45.5-2s0.7-0.2,0.8-0.3" + + "c0.3-0.4,0.4-1.1,0.3-1.3c0-0.5,0.4-1,0.9-1.1c0.5,0,1,0.4,1.1,0.9" + + "c0,0.2,0.1,1.8-0.8,2.8C47.5-0.4,46.8,0.1,45.6,0.1z" + ); + mouth.setAttribute("fill-opacity", "0.6"); + + this.catPath_.ear.setAttribute( + "d", + "M73.1-15.6c1.7-4.2,4.5-9.1,5.8-8.5" + + "c1.6,0.8,5.4,7.9,5,15.4c0,0.6-0.7,0.7-1.1,0.5c-3-1.6-6.4-2.8-8.6-3.6" + + "C72.8-12.3,72.4-13.7,73.1-15.6z" + ); + this.catPath_.ear.setAttribute("fill", "#FFD5E6"); + + this.catPath_.ear2.setAttribute( + "d", + "M22.4-15.6c-1.7-4.2-4.5-9.1-5.8-8.5" + + "c-1.6,0.8-5.4,7.9-5,15.4c0,0.6,0.7,0.7,1.1,0.5c3-1.6,6.4-2.8,8.6-3.6" + + "C22.8-12.3,23.2-13.7,22.4-15.6z" + ); + this.catPath_.ear2.setAttribute("fill", "#FFD5E6"); + }; + + Blockly.BlockSvg.prototype.initCatStuff = function () { + if (this.hasInitCatStuff) return; + this.hasInitCatStuff = true; + + // Ear part of the SVG path for hat blocks + var LEFT_EAR_UP = "c-1,-12.5 5.3,-23.3 8.4,-24.8c3.7,-1.8 16.5,13.1 18.4,15.4"; + var LEFT_EAR_DOWN = "c-5.8,-4.8 -8,-18 -4.9,-19.5c3.7,-1.8 24.5,11.1 31.7,10.1"; + var RIGHT_EAR_UP = "c1.9,-2.3 14.7,-17.2 18.4,-15.4c3.1,1.5 9.4,12.3 8.4,24.8"; + var RIGHT_EAR_DOWN = "c7.2,1 28,-11.9 31.7,-10.1c3.1,1.5 0.9,14.7 -4.9,19.5"; + // Ears look slightly different for define hat blocks + var DEFINE_HAT_LEFT_EAR_UP = "c0,-7.1 3.7,-13.3 9.3,-16.9c1.7,-7.5 5.4,-13.2 7.6,-14.2c2.6,-1.3 10,6 14.6,11.1"; + var DEFINE_HAT_RIGHT_EAR_UP = "h33c4.6,-5.1 11.9,-12.4 14.6,-11.1c1.9,0.9 4.9,5.2 6.8,11.1c2.6,0,5.2,0,7.8,0"; + var DEFINE_HAT_LEFT_EAR_DOWN = + "c0,-4.6 1.6,-8.9 4.3,-12.3c-2.4,-5.6 -2.9,-12.4 -0.7,-13.4c2.1,-1 9.6,2.6 17,5.8" + "c2.6,0 6.2,0 10.9,0"; + var DEFINE_HAT_RIGHT_EAR_DOWN = "c0,0 25.6,0 44,0c7.4,-3.2 14.8,-6.8 16.9,-5.8c1.2,0.6 1.6,2.9 1.3,5.8"; + + var that = this; + this.catPath_.ear = Blockly.utils.createSvgElement("path", {}, this.catPath_); + this.catPath_.ear2 = Blockly.utils.createSvgElement("path", {}, this.catPath_); + if (this.RTL) { + // Mirror the ears. + this.catPath_.ear.setAttribute("transform", "scale(-1 1)"); + this.catPath_.ear2.setAttribute("transform", "scale(-1 1)"); + } + this.catPath_.addEventListener("mouseenter", function (event) { + clearTimeout(that.blinkFn); + // blink + if (event.target.svgFace.eye) { + event.target.svgFace.eye.setAttribute("fill-opacity", "0"); + event.target.svgFace.eye2.setAttribute("fill-opacity", "0"); + event.target.svgFace.closedEye.setAttribute("fill-opacity", "0.6"); + event.target.svgFace.closedEye2.setAttribute("fill-opacity", "0.6"); + } + + // reset after a short delay + that.blinkFn = setTimeout(function () { + if (event.target.svgFace.eye) { + event.target.svgFace.eye.setAttribute("fill-opacity", "0.6"); + event.target.svgFace.eye2.setAttribute("fill-opacity", "0.6"); + event.target.svgFace.closedEye.setAttribute("fill-opacity", "0"); + event.target.svgFace.closedEye2.setAttribute("fill-opacity", "0"); + } + }, 100); + }); + + this.catPath_.ear.addEventListener("mouseenter", function () { + clearTimeout(that.earFn); + clearTimeout(that.ear2Fn); + // ear flick + that.catPath_.ear.setAttribute("fill-opacity", "0"); + that.catPath_.ear2.setAttribute("fill-opacity", ""); + var bodyPath = that.catPath_.svgBody.getAttribute("d"); + bodyPath = bodyPath.replace(RIGHT_EAR_UP, RIGHT_EAR_DOWN); + bodyPath = bodyPath.replace(DEFINE_HAT_RIGHT_EAR_UP, DEFINE_HAT_RIGHT_EAR_DOWN); + bodyPath = bodyPath.replace(LEFT_EAR_DOWN, LEFT_EAR_UP); + bodyPath = bodyPath.replace(DEFINE_HAT_LEFT_EAR_DOWN, DEFINE_HAT_LEFT_EAR_UP); + that.catPath_.svgBody.setAttribute("d", bodyPath); + + // reset after a short delay + that.earFn = setTimeout(function () { + that.catPath_.ear.setAttribute("fill-opacity", ""); + var bodyPath = that.catPath_.svgBody.getAttribute("d"); + bodyPath = bodyPath.replace(RIGHT_EAR_DOWN, RIGHT_EAR_UP); + bodyPath = bodyPath.replace(DEFINE_HAT_RIGHT_EAR_DOWN, DEFINE_HAT_RIGHT_EAR_UP); + that.catPath_.svgBody.setAttribute("d", bodyPath); + }, 50); + }); + this.catPath_.ear2.addEventListener("mouseenter", function () { + clearTimeout(that.earFn); + clearTimeout(that.ear2Fn); + // ear flick + that.catPath_.ear2.setAttribute("fill-opacity", "0"); + that.catPath_.ear.setAttribute("fill-opacity", ""); + var bodyPath = that.catPath_.svgBody.getAttribute("d"); + bodyPath = bodyPath.replace(LEFT_EAR_UP, LEFT_EAR_DOWN); + bodyPath = bodyPath.replace(DEFINE_HAT_LEFT_EAR_UP, DEFINE_HAT_LEFT_EAR_DOWN); + bodyPath = bodyPath.replace(RIGHT_EAR_DOWN, RIGHT_EAR_UP); + bodyPath = bodyPath.replace(DEFINE_HAT_RIGHT_EAR_DOWN, DEFINE_HAT_RIGHT_EAR_UP); + that.catPath_.svgBody.setAttribute("d", bodyPath); + + // reset after a short delay + that.ear2Fn = setTimeout(function () { + that.catPath_.ear2.setAttribute("fill-opacity", ""); + var bodyPath = that.catPath_.svgBody.getAttribute("d"); + bodyPath = bodyPath.replace(LEFT_EAR_DOWN, LEFT_EAR_UP); + bodyPath = bodyPath.replace(DEFINE_HAT_LEFT_EAR_DOWN, DEFINE_HAT_LEFT_EAR_UP); + that.catPath_.svgBody.setAttribute("d", bodyPath); + }, 50); + }); + if (this.RTL) { + // Set to the correct initial position + this.svgFace_.style.transform = "translate(-87px, 0px)"; + } + if (this.shouldWatchMouse()) { + this.windowListener = function (event) { + var time = Date.now(); + if (time < that.lastCallTime + that.CALL_FREQUENCY_MS) return; + that.lastCallTime = time; + if (!that.shouldWatchMouse()) return; + + // mouse watching + if (that.workspace) { + // not disposed + var xy = that.getCatFacePosition(); + var mouseLocation = { + x: event.x / that.workspace.scale, + y: event.y / that.workspace.scale, + }; + + var dx = mouseLocation.x - xy.x; + var dy = mouseLocation.y - xy.y; + var theta = Math.atan2(dx, dy); + + // Map the vector from the cat face to the mouse location to a much shorter + // vector in the same direction, which will be the translation vector for + // the cat face + var delta = Math.sqrt(dx * dx + dy * dy); + var scaleFactor = delta / (delta + 1); + + // Equation for radius of ellipse at theta for axes with length a and b + var a = 2; + var b = 5; + var r = (a * b) / Math.sqrt(Math.pow(b * Math.cos(theta), 2) + Math.pow(a * Math.sin(theta), 2)); + + // Convert polar coordinate back to x, y coordinate + dx = r * scaleFactor * Math.sin(theta); + dy = r * scaleFactor * Math.cos(theta); + + if (that.RTL) dx -= 87; // Translate face over + that.svgFace_.style.transform = "translate(" + dx + "px, " + dy + "px)"; + } + }; + document.addEventListener("mousemove", this.windowListener); + } + }; + + let workspacePositionRect = null; + Blockly.BlockSvg.prototype.getCatFacePosition = function () { + // getBoundingClientRect is not performant + //var offset = that.workspace.getParentSvg().getBoundingClientRect(); + if (!workspacePositionRect) { + workspacePositionRect = this.workspace.getParentSvg().getBoundingClientRect(); + } + var offset = { x: workspacePositionRect.x, y: workspacePositionRect.y }; + + if (!this.isInFlyout && this.workspace.getFlyout()) { + offset.x += this.workspace.getFlyout().getWidth(); + } + + offset.x += this.workspace.scrollX; + offset.y += this.workspace.scrollY; + + var xy = this.getRelativeToSurfaceXY(this.svgGroup_); + if (this.RTL) { + xy.x = this.workspace.getWidth() - xy.x - this.width; + } + // convert to workspace units + xy.x += offset.x / this.workspace.scale; + xy.y += offset.y / this.workspace.scale; + // distance to center of face + xy.x -= 43.5; + xy.y -= 4; + // flyout category offset + xy.x += 60; + if (this.RTL) { + // We've been calculating from the right edge. Convert x to from left edge. + xy.x = screen.width - xy.x; + } + return xy; + }; + + Blockly.BlockSvg.prototype.shouldWatchMouse = function () { + if (!shouldWatchMouseCursor) return false; + // if (window.vmLoadHigh || !window.CAT_CHASE_MOUSE) return false; + var xy = this.getCatFacePosition(); + const MARGIN = 50; + var blockXOnScreen = xy.x > -MARGIN && xy.x - MARGIN < screen.width / this.workspace.scale; + var blockYOnScreen = xy.y > -MARGIN && xy.y - MARGIN < screen.height / this.workspace.scale; + return this.startHat_ && !this.isGlowingStack_ && blockXOnScreen && blockYOnScreen; + }; + + const originalRenderDraw = Blockly.BlockSvg.prototype.renderDraw_; + Blockly.BlockSvg.prototype.renderDraw_ = function (...args) { + if (!this.svgFace_) { + this.sa_catBlockConstructor(); + } + const r = originalRenderDraw.call(this, ...args); + if (this.output_ !== undefined) return r; + if (!this.outputConnection && !this.previousConnection) { + this.initCatStuff(); + } + if (this.startHat_ && !this.svgFace_.firstChild) { + this.renderCatFace_(); + } + return r; + }; + + const originalDispose = Blockly.BlockSvg.prototype.dispose; + Blockly.BlockSvg.prototype.dispose = function (...args) { + clearTimeout(this.blinkFn); + clearTimeout(this.earFn); + clearTimeout(this.ear2Fn); + if (this.windowListener) { + document.removeEventListener("mousemove", this.windowListener); + } + return originalDispose.call(this, ...args); + }; + + const originalSetGlowStack = Blockly.BlockSvg.prototype.setGlowStack; + Blockly.BlockSvg.prototype.setGlowStack = function (isGlowingStack) { + if (this.windowListener) { + if (isGlowingStack) { + // For performance, don't follow the mouse when the stack is glowing + document.removeEventListener("mousemove", this.windowListener); + if (this.workspace && this.svgFace_.style) { + // reset face direction + if (this.RTL) { + this.svgFace_.style.transform = "translate(-87px, 0px)"; + } else { + this.svgFace_.style.transform = ""; + } + } + } else { + document.addEventListener("mousemove", this.windowListener); + } + } + return originalSetGlowStack.call(this, isGlowingStack); + }; + + Blockly.BlockSvg.prototype.sa_catBlockConstructor = function () { + this.catPath_ = Blockly.utils.createSvgElement("g", {}, this.svgGroup_); + + this.svgFace_ = Blockly.utils.createSvgElement("g", {}, this.catPath_); + this.catPath_.svgFace = this.svgFace_; + this.catPath_.svgBody = this.svgPath_; + this.lastCallTime = 0; + this.CALL_FREQUENCY_MS = 60; + }; + + const workspace = Blockly.getMainWorkspace(); + if (workspace) { + const vm = addon.tab.traps.vm; + if (vm.editingTarget) { + vm.emitWorkspaceUpdate(); + } + const flyout = workspace.getFlyout(); + if (flyout) { + const flyoutWorkspace = flyout.getWorkspace(); + Blockly.Xml.clearWorkspaceAndLoadFromXml(Blockly.Xml.workspaceToDom(flyoutWorkspace), flyoutWorkspace); + workspace.getToolbox().refreshSelection(); + workspace.toolboxRefreshEnabled_ = true; + } + } +} \ No newline at end of file diff --git a/src/addons/addons/clones/300cats.svg b/src/addons/addons/clones/300cats.svg new file mode 100644 index 0000000000000000000000000000000000000000..a056692a3b3973973258b043d5d403aca0704bfe Binary files /dev/null and b/src/addons/addons/clones/300cats.svg differ diff --git a/src/addons/addons/clones/_manifest_entry.js b/src/addons/addons/clones/_manifest_entry.js new file mode 100644 index 0000000000000000000000000000000000000000..ea4fa32ae106b472ec0c74fe680b5703b7abfb56 --- /dev/null +++ b/src/addons/addons/clones/_manifest_entry.js @@ -0,0 +1,40 @@ +/* generated by pull.js */ +const manifest = { + "editorOnly": true, + "name": "Clone counter", + "description": "Adds a counter above the stage in the editor which shows the total amount of clones.", + "credits": [ + { + "name": "Jeffalo" + }, + { + "name": "OregSam", + "link": "https://scratch.mit.edu/users/simiagain/" + } + ], + "dynamicDisable": true, + "userscripts": [ + { + "url": "userscript.js" + } + ], + "userstyles": [ + { + "url": "style.css" + } + ], + "settings": [ + { + "dynamic": true, + "id": "showicononly", + "name": "Show icon only", + "default": false, + "type": "boolean" + } + ], + "tags": [ + "recommended" + ], + "enabledByDefault": true +}; +export default manifest; diff --git a/src/addons/addons/clones/_runtime_entry.js b/src/addons/addons/clones/_runtime_entry.js new file mode 100644 index 0000000000000000000000000000000000000000..417353837ccd9bf5600107a6b87f49fcefe4de3d --- /dev/null +++ b/src/addons/addons/clones/_runtime_entry.js @@ -0,0 +1,11 @@ +/* generated by pull.js */ +import _js from "./userscript.js"; +import _css from "!css-loader!./style.css"; +import _asset from "!url-loader!./300cats.svg"; +import _asset2 from "!url-loader!./cat.svg"; +export const resources = { + "userscript.js": _js, + "style.css": _css, + "300cats.svg": _asset, + "cat.svg": _asset2, +}; diff --git a/src/addons/addons/clones/cat.svg b/src/addons/addons/clones/cat.svg new file mode 100644 index 0000000000000000000000000000000000000000..6f3340943e29a662e95f645c8a94b4d3cf206247 Binary files /dev/null and b/src/addons/addons/clones/cat.svg differ diff --git a/src/addons/addons/clones/style.css b/src/addons/addons/clones/style.css new file mode 100644 index 0000000000000000000000000000000000000000..234ef4594bdcf0bd80818b0a4055957ee4609366 --- /dev/null +++ b/src/addons/addons/clones/style.css @@ -0,0 +1,42 @@ +.clone-container-container { + display: none; + align-items: center; + padding: 0.25rem; + user-select: none; + color: #a065ff; +} + +.clone-container { + font-size: 0.625rem; + font-weight: bold; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + white-space: nowrap; +} + +.clone-icon { + margin: 0.25rem; + display: inline-block; + background-image: url("./cat.svg"); + height: 16px; + width: 16px; +} + +.clone-container-container[data-count="none"] { + display: none; +} + +.clone-container-container[data-count="full"] { + color: #ff6680; +} + +.clone-container-container[data-count="full"] .clone-icon { + background-image: url("./300cats.svg"); +} + +.clone-count::after { + content: attr(data-str); +} + +.sa-clones-small .clone-container-container { + display: none !important; +} diff --git a/src/addons/addons/clones/userscript.js b/src/addons/addons/clones/userscript.js new file mode 100644 index 0000000000000000000000000000000000000000..0aa349558d5cdf40b4a93d09d716d9ca07af0e42 --- /dev/null +++ b/src/addons/addons/clones/userscript.js @@ -0,0 +1,99 @@ +export default async function ({ addon, console, msg }) { + const vm = addon.tab.traps.vm; + + let showIconOnly = addon.settings.get("showicononly"); + + if (addon.tab.redux.state && addon.tab.redux.state.scratchGui.stageSize.stageSize === "small") { + document.body.classList.add("sa-clones-small"); + } + document.addEventListener( + "click", + (e) => { + if (e.target.closest("[class*='stage-header_stage-button-first']")) { + document.body.classList.add("sa-clones-small"); + } else if (e.target.closest("[class*='stage-header_stage-button-last']")) { + document.body.classList.remove("sa-clones-small"); + } + }, + { capture: true } + ); + + let countContainerContainer = document.createElement("div"); + addon.tab.displayNoneWhileDisabled(countContainerContainer); + + let countContainer = document.createElement("div"); + let count = document.createElement("span"); + let icon = document.createElement("span"); + + countContainerContainer.className = "clone-container-container"; + countContainer.className = "clone-container"; + count.className = "clone-count"; + icon.className = "clone-icon"; + + countContainerContainer.appendChild(icon); + countContainerContainer.appendChild(countContainer); + countContainer.appendChild(count); + + let lastChecked = 0; + + const cache = Array(301) + .fill() + .map((_, i) => msg("clones", { cloneCount: i })); + + function doCloneChecks(force) { + const v = vm.runtime._cloneCounter; + // performance + if (v === lastChecked && !force) return; + lastChecked = v; + if (v === 0) { + countContainerContainer.dataset.count = "none"; + } else if (v >= vm.runtime.runtimeOptions.maxClones) { + countContainerContainer.dataset.count = "full"; + } else { + countContainerContainer.dataset.count = ""; + } + if (showIconOnly) { + count.dataset.str = v; + } else { + count.dataset.str = cache[v] || msg("clones", { cloneCount: v }); + } + + if (v === 0) countContainerContainer.style.display = "none"; + else countContainerContainer.style.display = "flex"; + } + + addon.settings.addEventListener("change", () => { + showIconOnly = addon.settings.get("showicononly"); + doCloneChecks(true); + }); + + const oldStep = vm.runtime._step; + vm.runtime._step = function (...args) { + const ret = oldStep.call(this, ...args); + doCloneChecks(); + return ret; + }; + + /* + if (addon.self.enabledLate) { + // Clone count might be inaccurate if the user deleted sprites + // before enabling the addon + let count = 0; + for (let target of vm.runtime.targets) { + if (!target.isOriginal) ++count; + } + vm.runtime._cloneCounter = count; + } + */ + + while (true) { + await addon.tab.waitForElement('[class*="controls_controls-container"]', { + markAsSeen: true, + reduxEvents: ["scratch-gui/mode/SET_PLAYER", "fontsLoaded/SET_FONTS_LOADED", "scratch-gui/locales/SELECT_LOCALE"], + }); + + if (addon.tab.editorMode === "editor" || addon.tab.redux.state.scratchGui.mode.isEmbedded) { + addon.tab.appendToSharedSpace({ space: "afterStopButton", element: countContainerContainer, order: 2 }); + } + } +} \ No newline at end of file diff --git a/src/addons/addons/color-picker/_manifest_entry.js b/src/addons/addons/color-picker/_manifest_entry.js new file mode 100644 index 0000000000000000000000000000000000000000..f7d0daf06d7edb246cda159eb47901ad99e53472 --- /dev/null +++ b/src/addons/addons/color-picker/_manifest_entry.js @@ -0,0 +1,30 @@ +/* generated by pull.js */ +const manifest = { + "editorOnly": true, + "name": "Hex color picker", + "description": "Adds hex code inputs to color pickers.", + "tags": [ + "recommended" + ], + "credits": [ + { + "name": "Richie Bendall" + }, + { + "name": "apple502j" + } + ], + "userscripts": [ + { + "url": "userscript.js" + } + ], + "userstyles": [ + { + "url": "style.css" + } + ], + "dynamicDisable": true, + "enabledByDefault": true +}; +export default manifest; diff --git a/src/addons/addons/color-picker/_runtime_entry.js b/src/addons/addons/color-picker/_runtime_entry.js new file mode 100644 index 0000000000000000000000000000000000000000..76c9ca1f43154011942db097b82ae033d913de82 --- /dev/null +++ b/src/addons/addons/color-picker/_runtime_entry.js @@ -0,0 +1,7 @@ +/* generated by pull.js */ +import _js from "./userscript.js"; +import _css from "!css-loader!./style.css"; +export const resources = { + "userscript.js": _js, + "style.css": _css, +}; diff --git a/src/addons/addons/color-picker/code-editor.js b/src/addons/addons/color-picker/code-editor.js new file mode 100644 index 0000000000000000000000000000000000000000..9bbc01f9c1db95f4bf5355894a7b4c911dca04fc --- /dev/null +++ b/src/addons/addons/color-picker/code-editor.js @@ -0,0 +1,88 @@ +import { normalizeHex, getHexRegex } from "../../libraries/common/cs/normalize-color.js"; +import RateLimiter from "../../libraries/common/cs/rate-limiter.js"; +import tinycolor from "../../libraries/thirdparty/cs/tinycolor-min.js"; + +export default async ({ addon, console, msg }) => { + // 250-ms rate limit + const rateLimiter = new RateLimiter(250); + const getColor = (element) => { + const { children } = element.parentElement; + // h: 0 - 360 + const h = children[1].getAttribute("aria-valuenow"); + // s: 0 - 1 + const s = children[3].getAttribute("aria-valuenow"); + // v: 0 - 255, divide by 255 + const vMultipliedBy255 = children[5].getAttribute("aria-valuenow"); + const v = Number(vMultipliedBy255) / 255; + return tinycolor(`hsv(${h}, ${s}, ${v || 0})`).toHexString(); + }; + const setColor = (hex, element) => { + hex = normalizeHex(hex); + if (!addon.tab.redux.state || !addon.tab.redux.state.scratchGui) return; + // The only way to reliably set color is to invoke eye dropper via click() + // then faking that the eye dropper reported the value. + const onEyeDropperClosed = ({ detail }) => { + if (detail.action.type !== "scratch-gui/color-picker/DEACTIVATE_COLOR_PICKER") return; + addon.tab.redux.removeEventListener("statechanged", onEyeDropperClosed); + setTimeout(() => { + document.body.classList.remove("sa-hide-eye-dropper-background"); + }, 50); + }; + const onEyeDropperOpened = ({ detail }) => { + if (detail.action.type !== "scratch-gui/color-picker/ACTIVATE_COLOR_PICKER") return; + addon.tab.redux.removeEventListener("statechanged", onEyeDropperOpened); + addon.tab.redux.addEventListener("statechanged", onEyeDropperClosed); + setTimeout(() => { + addon.tab.redux.dispatch({ + type: "scratch-gui/color-picker/DEACTIVATE_COLOR_PICKER", + color: hex, + }); + }, 50); + }; + addon.tab.redux.addEventListener("statechanged", onEyeDropperOpened); + document.body.classList.add("sa-hide-eye-dropper-background"); + element.click(); + }; + const addColorPicker = () => { + const element = document.querySelector("button.scratchEyedropper"); + rateLimiter.abort(false); + addon.tab.redux.initialize(); + const defaultColor = getColor(element); + const saColorPicker = Object.assign(document.createElement("div"), { + className: "sa-color-picker sa-color-picker-code", + }); + addon.tab.displayNoneWhileDisabled(saColorPicker, { display: "flex" }); + const saColorPickerColor = Object.assign(document.createElement("input"), { + className: "sa-color-picker-color sa-color-picker-code-color", + type: "color", + value: defaultColor || "#000000", + }); + const saColorPickerText = Object.assign(document.createElement("input"), { + className: addon.tab.scratchClass("input_input-form", { + others: "sa-color-picker-text sa-color-picker-code-text", + }), + type: "text", + pattern: "^#?([0-9a-fA-F]{3}){1,2}$", + placeholder: msg("hex"), + value: defaultColor || "", + }); + saColorPickerColor.addEventListener("input", () => + rateLimiter.limit(() => setColor((saColorPickerText.value = saColorPickerColor.value), element)) + ); + saColorPickerText.addEventListener("change", () => { + const { value } = saColorPickerText; + if (!getHexRegex().test(value)) return; + setColor((saColorPickerColor.value = normalizeHex(value)), element); + }); + saColorPicker.appendChild(saColorPickerColor); + saColorPicker.appendChild(saColorPickerText); + element.parentElement.insertBefore(saColorPicker, element); + }; + const ScratchBlocks = await addon.tab.traps.getBlockly(); + const originalShowEditor = ScratchBlocks.FieldColourSlider.prototype.showEditor_; + ScratchBlocks.FieldColourSlider.prototype.showEditor_ = function (...args) { + const r = originalShowEditor.call(this, ...args); + addColorPicker(); + return r; + }; +}; diff --git a/src/addons/addons/color-picker/paint-editor.js b/src/addons/addons/color-picker/paint-editor.js new file mode 100644 index 0000000000000000000000000000000000000000..123128173c7461925a2c9edb48085cb1b3772773 --- /dev/null +++ b/src/addons/addons/color-picker/paint-editor.js @@ -0,0 +1,109 @@ +/** + * !!! TW: This file is unused. + */ + +import { normalizeHex, getHexRegex } from "../../libraries/common/cs/normalize-color.js"; +import RateLimiter from "../../libraries/common/cs/rate-limiter.js"; + +export default async ({ addon, console, msg }) => { + let prevEventHandler; + // 250-ms rate limit + const rateLimiter = new RateLimiter(250); + const getColor = (element) => { + let fillOrStroke; + const state = addon.tab.redux.state; + if (state.scratchPaint.modals.fillColor) { + fillOrStroke = "fill"; + } else if (state.scratchPaint.modals.strokeColor) { + fillOrStroke = "stroke"; + } else { + // fillOrStroke = "ihadastroke"; + return; + } + const colorType = state.scratchPaint.fillMode.colorIndex; + const primaryOrSecondary = ["primary", "secondary"][colorType]; + const color = state.scratchPaint.color[`${fillOrStroke}Color`][primaryOrSecondary]; + if (color === null || color === "scratch-paint/style-path/mixed") return; + // This value can be arbitrary - it can be HEX, RGB, etc. + // Use tinycolor to convert them. + return tinycolor(color).toHexString(); + }; + const setColor = (hex, element) => { + hex = normalizeHex(hex); + if (!addon.tab.redux.state || !addon.tab.redux.state.scratchPaint) return; + // The only way to reliably set color is to invoke eye dropper via click() + // then faking that the eye dropper reported the value. + const onEyeDropperOpened = ({ detail }) => { + if (detail.action.type !== "scratch-paint/eye-dropper/ACTIVATE_COLOR_PICKER") return; + addon.tab.redux.removeEventListener("statechanged", onEyeDropperOpened); + setTimeout(() => { + const previousTool = addon.tab.redux.state.scratchPaint.color.eyeDropper.previousTool; + if (previousTool) previousTool.activate(); + addon.tab.redux.state.scratchPaint.color.eyeDropper.callback( + tinycolor(hex).setAlpha(scratchAddons.opacitySliderAlpha).toRgbString() + ); + addon.tab.redux.dispatch({ + type: "scratch-paint/eye-dropper/DEACTIVATE_COLOR_PICKER", + }); + }, 50); + }; + addon.tab.redux.addEventListener("statechanged", onEyeDropperOpened); + element.children[1].children[0].click(); + }; + while (true) { + const element = await addon.tab.waitForElement('div[class*="color-picker_swatch-row"]', { + markAsSeen: true, + reduxCondition: (state) => state.scratchGui.editorTab.activeTabIndex === 1 && !state.scratchGui.mode.isPlayerOnly, + }); + rateLimiter.abort(false); + addon.tab.redux.initialize(); + if (!("colorIndex" in addon.tab.redux.state.scratchPaint.fillMode)) { + console.error("Detected new paint editor; this will be supported in future versions."); + return; + } + if (addon.tab.redux && typeof prevEventHandler === "function") { + addon.tab.redux.removeEventListener("statechanged", prevEventHandler); + prevEventHandler = null; + } + if (addon.tab.editorMode !== "editor") continue; + const defaultColor = getColor(element); + const saColorPicker = Object.assign(document.createElement("div"), { + className: "sa-color-picker sa-color-picker-paint", + }); + addon.tab.displayNoneWhileDisabled(saColorPicker, { display: "flex" }); + const saColorPickerColor = Object.assign(document.createElement("input"), { + className: "sa-color-picker-color sa-color-picker-paint-color", + type: "color", + value: defaultColor || "#000000", + }); + const inputClass = document.querySelector('[class*="fixed-tools_costume-input"]').className.split(" ")[0]; + const saColorPickerText = Object.assign(document.createElement("input"), { + className: `sa-color-picker-text sa-color-picker-paint-text ${inputClass}`, + type: "text", + pattern: "^#?([0-9a-fA-F]{3}){1,2}$", + placeholder: msg("hex"), + value: defaultColor || "", + }); + saColorPickerColor.addEventListener("input", () => + rateLimiter.limit(() => setColor((saColorPickerText.value = saColorPickerColor.value), element)) + ); + saColorPickerText.addEventListener("change", () => { + const { value } = saColorPickerText; + if (!getHexRegex().test(value)) return; + setColor((saColorPickerColor.value = normalizeHex(value)), element); + }); + prevEventHandler = ({ detail }) => { + if (detail.action.type === "scratch-paint/color-index/CHANGE_COLOR_INDEX") { + setTimeout(() => { + const color = getColor(element); + saColorPickerColor.value = color || "#000000"; + saColorPickerText.value = color || ""; + }, 100); + } + }; + addon.tab.redux.addEventListener("statechanged", prevEventHandler); + saColorPicker.appendChild(saColorPickerColor); + saColorPicker.appendChild(saColorPickerText); + element.parentElement.insertBefore(saColorPicker, element); + } +}; diff --git a/src/addons/addons/color-picker/style.css b/src/addons/addons/color-picker/style.css new file mode 100644 index 0000000000000000000000000000000000000000..47f02c55636cfa627c3bdbe5619d642475e0db0d --- /dev/null +++ b/src/addons/addons/color-picker/style.css @@ -0,0 +1,57 @@ +.sa-color-picker { + display: flex; +} + +.sa-color-picker-code { + margin: 8px 0; +} + +.sa-color-picker-paint { + margin-top: 16px; + margin-bottom: 4px; +} + +.sa-color-picker > .sa-color-picker-color { + border: none; + border-top-left-radius: 1rem; + border-bottom-left-radius: 1rem; + padding: 0; + padding-left: 0.6rem; + padding-right: 0.4rem; + margin-left: 0.5rem; + outline: none; + box-sizing: border-box; + width: 3rem; + height: 2rem; +} +[theme="dark"] .sa-color-picker > .sa-color-picker-color { + background: var(--ui-secondary); +} + +.sa-color-picker > .sa-color-picker-text { + box-sizing: border-box; + width: calc(150px - 3rem); + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} + +[dir="rtl"] .sa-color-picker > .sa-color-picker-color { + border-top-left-radius: 0; + border-bottom-left-radius: 0; + border-top-right-radius: 1rem; + border-bottom-right-radius: 1rem; + margin-left: 0; + margin-right: 0.5rem; +} + +[dir="rtl"] .sa-color-picker > .sa-color-picker-text { + border-top-left-radius: 1rem; + border-bottom-left-radius: 1rem; + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} + +body.sa-hide-eye-dropper-background div[class*="stage_color-picker-background"] { + /* Do not show eye dropper background if the color picker is "fake" */ + display: none; +} diff --git a/src/addons/addons/color-picker/userscript.js b/src/addons/addons/color-picker/userscript.js new file mode 100644 index 0000000000000000000000000000000000000000..9850cb33940245e6ec5dabfe3abfea271fa5c6e4 --- /dev/null +++ b/src/addons/addons/color-picker/userscript.js @@ -0,0 +1,5 @@ +import codeEditorHandler from "./code-editor.js"; + +export default async (api) => { + codeEditorHandler(api); +}; diff --git a/src/addons/addons/columns/_manifest_entry.js b/src/addons/addons/columns/_manifest_entry.js new file mode 100644 index 0000000000000000000000000000000000000000..717a2cfe0acd97515fe433c48cf92b60db4ca7f6 --- /dev/null +++ b/src/addons/addons/columns/_manifest_entry.js @@ -0,0 +1,26 @@ +/* generated by pull.js */ +const manifest = { + "editorOnly": true, + "noTranslations": true, + "name": "Two-column category menu", + "description": "Splits the block category menu into two columns and moves it to the top of the block palette, like in Scratch 2.0.", + "credits": [ + { + "name": "TheColaber", + "link": "https://scratch.mit.edu/TheColaber" + } + ], + "tags": [], + "dynamicDisable": true, + "userscripts": [ + { + "url": "userscript.js" + } + ], + "userstyles": [ + { + "url": "style.css" + } + ] +}; +export default manifest; diff --git a/src/addons/addons/columns/_runtime_entry.js b/src/addons/addons/columns/_runtime_entry.js new file mode 100644 index 0000000000000000000000000000000000000000..76c9ca1f43154011942db097b82ae033d913de82 --- /dev/null +++ b/src/addons/addons/columns/_runtime_entry.js @@ -0,0 +1,7 @@ +/* generated by pull.js */ +import _js from "./userscript.js"; +import _css from "!css-loader!./style.css"; +export const resources = { + "userscript.js": _js, + "style.css": _css, +}; diff --git a/src/addons/addons/columns/style.css b/src/addons/addons/columns/style.css new file mode 100644 index 0000000000000000000000000000000000000000..5e3b1ed6bbf9a098e8818cfe92d08d3808f3c906 --- /dev/null +++ b/src/addons/addons/columns/style.css @@ -0,0 +1,103 @@ +[class*="blocks_blocks_"] .blocklyToolboxDiv { + width: 310px; + height: auto !important; +} + +.scratchCategoryMenu { + width: 100%; + columns: 2; + column-gap: 0.5rem; + padding: 0.25rem; +} + +.scratchCategorySecondMenu { + columns: 1; + display: grid; + grid-template-columns: repeat(2, 1fr); + padding-bottom: 2.25rem; +} + +.scratchCategorySecondMenu:empty { + padding-top: 0; + padding-bottom: 2rem; +} + +.scratchCategoryMenuItem { + display: inline-flex; /* inline so that it isn't split between both columns */ + width: 100%; + padding: 0.25rem; + border-radius: 0.875rem; +} + +.scratchCategoryItemBubble, +.scratchCategoryItemIcon { + margin: 0; + margin-inline-end: 0.5rem; +} + +.scratchCategoryMenuItemLabel { + flex: 1; + display: flex; + align-items: center; +} + +[class*="gui_extension-button-container_"] { + top: var(--sa-add-extension-button-y); + bottom: auto; + margin-inline-start: 0.5rem; + width: calc(308px - 1rem); + height: calc(1.75rem - 2px); + background-color: transparent; + border-color: var(--ui-black-transparent, rgba(0, 0, 0, 0.15)); +} + +/* [dir] is for specificity to override editor-stage-left */ +[dir] [class*="gui_extension-button-container_"] { + border-radius: 0.25rem; +} + +[class*="gui_extension-button-container_"]:hover { + background-color: var(--ui-tertiary, white); +} + +[class*="gui_extension-button-container_"]::before { + display: none; +} + +[class*="gui_extension-button_"] { + display: flex; + align-items: center; + padding-inline: 0; +} + +[class*="gui_extension-button-icon_"] { + filter: var(--editorDarkMode-categoryMenu-invertedFilter, brightness(0.4)); +} + +[class*="gui_extension-button-container_"]:hover [class*="gui_extension-button-icon_"] { + filter: var(--editorDarkMode-accent-invertedFilter, brightness(0.4)); +} +[theme="dark"] [class*="gui_extension-button-icon_"] { + filter: none !important; +} + +.sa-add-extension-label { + color: var(--text-primary, #575e75); + font-size: 0.65rem; +} + +[class*="gui_extension-button-container_"]:hover .sa-add-extension-label { + color: var(--text-primary, #575e75); + font-size: 0.65rem; +} + +/* hide-flyout compatibility */ + +[class*="gui_tabs_"] { + --sa-flyout-width: 310px; + --sa-category-width: 0; +} + +.sa-flyout-placeHolder { + top: calc(var(--sa-flyout-y)); +} diff --git a/src/addons/addons/columns/userscript.js b/src/addons/addons/columns/userscript.js new file mode 100644 index 0000000000000000000000000000000000000000..de81172f475bec2fbeba275a30397b940bae9cd3 --- /dev/null +++ b/src/addons/addons/columns/userscript.js @@ -0,0 +1,171 @@ +export default async function ({ addon, msg, console }) { + const Blockly = await addon.tab.traps.getBlockly(); + + // https://github.com/LLK/scratch-blocks/blob/893c7e7ad5bfb416eaed75d9a1c93bdce84e36ab/core/toolbox.js#L235 + const _ToolboxPosition = Blockly.Toolbox.prototype.position; + Blockly.Toolbox.prototype.position = function () { + _ToolboxPosition.call(this); + + // Update flyout position when category menu height changes. + if (this.HtmlDiv && !this.HtmlDiv._observer) { + this.HtmlDiv._observer = new ResizeObserver(() => { + this.flyout_.position(); + }); + this.HtmlDiv._observer.observe(this.HtmlDiv); + } + }; + + // https://github.com/LLK/scratch-blocks/blob/893c7e7ad5bfb416eaed75d9a1c93bdce84e36ab/core/flyout_vertical.js#L314 + const _VerticalFlyoutPosition = Blockly.VerticalFlyout.prototype.position; + Blockly.VerticalFlyout.prototype.position = function () { + _VerticalFlyoutPosition.call(this); + if (addon.self.disabled || !this.isVisible()) { + return; + } + var targetWorkspaceMetrics = this.targetWorkspace_.getMetrics(); + if (!targetWorkspaceMetrics) { + // Hidden components will return null. + return; + } + + // In RTL, subtract the total width of left and right workspace borders and the category menu border + // from the workspace width. + var x = this.toolboxPosition_ === Blockly.TOOLBOX_AT_RIGHT ? targetWorkspaceMetrics.viewWidth - 3 : 0; + var y = this.parentToolbox_.HtmlDiv.offsetHeight; + + // Addon sets the width of the flyout to the width of the toolbox. + this.width_ = this.parentToolbox_.getWidth(); + 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 + (this.toolboxPosition_ === Blockly.TOOLBOX_AT_RIGHT ? 0 : this.width_ - this.getWidth()), + y + ); + this.scrollbar_.resize(); + } + + // Set CSS variables for the userstyle. + const container = this.svgGroup_.closest("[class*='gui_tab-panel_']"); + container.style.setProperty("--sa-add-extension-button-y", `${y - 33}px`); + container.parentElement.style.setProperty("--sa-flyout-y", `${y}px`); + }; + + // https://github.com/LLK/scratch-blocks/blob/893c7e7ad5bfb416eaed75d9a1c93bdce84e36ab/core/flyout_base.js#L370 + const _VerticalFlyoutGetWidth = Blockly.VerticalFlyout.prototype.getWidth; + Blockly.VerticalFlyout.prototype.getWidth = function () { + // In RTL, this will be called by Blockly to position blocks inside the flyout. + let width = _VerticalFlyoutGetWidth.call(this); + if (!addon.self.disabled) width += 60; + return width; + }; + + // https://github.com/LLK/scratch-blocks/blob/893c7e7ad5bfb416eaed75d9a1c93bdce84e36ab/core/toolbox.js#L595 + const _CategoryMenuCreateDom = Blockly.Toolbox.CategoryMenu.prototype.createDom; + Blockly.Toolbox.CategoryMenu.prototype.createDom = function () { + _CategoryMenuCreateDom.call(this); + if (addon.self.disabled) return; + this.secondTable = document.createElement("div"); + this.secondTable.className = + "scratchCategorySecondMenu " + + (this.parent_.horizontalLayout_ ? "scratchCategoryMenuHorizontal" : "scratchCategoryMenu"); + this.parentHtml_.appendChild(this.secondTable); + }; + + // https://github.com/LLK/scratch-blocks/blob/893c7e7ad5bfb416eaed75d9a1c93bdce84e36ab/core/toolbox.js#L606 + const _CategoryMenuPopulate = Blockly.Toolbox.CategoryMenu.prototype.populate; + Blockly.Toolbox.CategoryMenu.prototype.populate = function (domTree) { + if (!domTree) return; + + const Categories = [ + "motion", + "looks", + "sound", + "events", + "control", + "sensing", + "operators", + "variables", + "lists", + "myBlocks", + ]; + const extensionsNodes = []; + const extensionTree = domTree.cloneNode(true); + if (!addon.self.disabled) { + extensionTree.childNodes.forEach((child) => { + if (child.tagName === "category" && !Categories.includes(child.id)) { + extensionsNodes.push(child.cloneNode(true)); + child.remove(); + } + }); + } + _CategoryMenuPopulate.call(this, extensionTree); + for (const child of extensionsNodes) { + const row = document.createElement("div"); + row.className = "scratchCategoryMenuRow"; + this.secondTable.appendChild(row); + if (child) { + this.categories_.push(new Blockly.Toolbox.Category(this, row, child)); + } + } + if (!addon.self.disabled) { + this.height_ = this.table.offsetHeight + this.secondTable.offsetHeight; + } + }; + + // https://github.com/LLK/scratch-blocks/blob/893c7e7ad5bfb416eaed75d9a1c93bdce84e36ab/core/toolbox.js#L639 + const _CategoryMenuDispose = Blockly.Toolbox.CategoryMenu.prototype.dispose; + Blockly.Toolbox.CategoryMenu.prototype.dispose = function () { + _CategoryMenuDispose.call(this); + if (this.secondTable) { + this.secondTable.remove(); + this.secondTable = null; + } + }; + + function updateToolbox() { + const workspace = Blockly.getMainWorkspace(); + const toolbox = workspace.getToolbox(); + if (!toolbox) return; + const categoryMenu = toolbox.categoryMenu_; + if (!categoryMenu) return; + + // Scratch may have already updated the toolbox for us, so no need to update it again. + if (categoryMenu.secondTable && !addon.self.disabled) return; + // Must dispose and createDom the category menu so we can run our polluted commands. + categoryMenu.dispose(); + categoryMenu.createDom(); + // Repopulate the category menu since we've just disposed it. + toolbox.populate_(workspace.options.languageTree); + // Reposition the toolbox, since it's likely our addon moved it. + toolbox.position(); + } + + updateToolbox(); + addon.self.addEventListener("disabled", updateToolbox); + addon.self.addEventListener("reenabled", updateToolbox); + + while (true) { + const addExtensionButton = await addon.tab.waitForElement("[class*='gui_extension-button_']", { + markAsSeen: true, + reduxEvents: ["scratch-gui/mode/SET_PLAYER", "fontsLoaded/SET_FONTS_LOADED", "scratch-gui/locales/SELECT_LOCALE"], + condition: () => !addon.tab.redux.state.scratchGui.mode.isPlayerOnly, + }); + const addExtensionLabel = Object.assign(document.createElement("span"), { + className: "sa-add-extension-label", + innerText: addon.tab.scratchMessage("gui.gui.addExtension"), + }); + addon.tab.displayNoneWhileDisabled(addExtensionLabel); + addExtensionButton.appendChild(addExtensionLabel); + addExtensionButton.removeAttribute("title"); + } +} diff --git a/src/addons/addons/custom-block-shape/_manifest_entry.js b/src/addons/addons/custom-block-shape/_manifest_entry.js new file mode 100644 index 0000000000000000000000000000000000000000..325dbc2e529629fcf85a941a376ae6fbd2daa143 --- /dev/null +++ b/src/addons/addons/custom-block-shape/_manifest_entry.js @@ -0,0 +1,110 @@ +/* generated by pull.js */ +const manifest = { + "editorOnly": true, + "noTranslations": true, + "name": "Customizable block shape", + "description": "Adjust the padding, corner radius, and notch height of blocks.", + "tags": [ + "theme" + ], + "credits": [ + { + "name": "SheepTester", + "link": "https://scratch.mit.edu/users/Sheep_maker/" + }, + { + "name": "lisa_wolfgang", + "link": "https://scratch.mit.edu/users/lisa_wolfgang/" + }, + { + "name": "GarboMuffin", + "link": "https://scratch.mit.edu/users/GarboMuffin/" + } + ], + "enabledByDefault": false, + "dynamicDisable": true, + "userscripts": [ + { + "url": "userscript.js" + } + ], + "info": [ + { + "type": "notice", + "text": "Decreasing the padding size is only visible to you, so when your projects are viewed by other users, your scripts may overlap.", + "id": "paddingWarning" + } + ], + "settings": [ + { + "dynamic": true, + "name": "Padding size (50-200%)", + "id": "paddingSize", + "type": "integer", + "min": 50, + "default": 100, + "max": 200 + }, + { + "dynamic": true, + "name": "Corner size (0-300%)", + "id": "cornerSize", + "type": "integer", + "min": 0, + "default": 100, + "max": 300 + }, + { + "dynamic": true, + "name": "Notch height (0-150%)", + "id": "notchSize", + "type": "integer", + "min": 0, + "default": 100, + "max": 150 + } + ], + "presets": [ + { + "name": "3.0 Blocks", + "id": "default3", + "description": "The regular appearance of Scratch 3.0 blocks", + "values": { + "paddingSize": 100, + "cornerSize": 100, + "notchSize": 100 + } + }, + { + "name": "2.0 Blocks", + "id": "default2", + "description": "An appearance similar to Scratch 2.0 blocks", + "values": { + "paddingSize": 70, + "cornerSize": 150, + "notchSize": 75 + } + }, + { + "name": "3.0 Flat", + "id": "flat3", + "description": "Scratch 3.0 blocks with notches and corners removed", + "values": { + "paddingSize": 100, + "cornerSize": 0, + "notchSize": 0 + } + }, + { + "name": "2.0 Flat", + "id": "flat2", + "description": "Scratch 2.0 blocks with notches and corners removed", + "values": { + "paddingSize": 70, + "cornerSize": 0, + "notchSize": 0 + } + } + ] +}; +export default manifest; diff --git a/src/addons/addons/custom-block-shape/_runtime_entry.js b/src/addons/addons/custom-block-shape/_runtime_entry.js new file mode 100644 index 0000000000000000000000000000000000000000..bc67131957e52185c142f348760610cfaa4f774d --- /dev/null +++ b/src/addons/addons/custom-block-shape/_runtime_entry.js @@ -0,0 +1,5 @@ +/* generated by pull.js */ +import _js from "./userscript.js"; +export const resources = { + "userscript.js": _js, +}; diff --git a/src/addons/addons/custom-block-shape/userscript.js b/src/addons/addons/custom-block-shape/userscript.js new file mode 100644 index 0000000000000000000000000000000000000000..fb52be713273641c194cffe9c59e8fec675a087d --- /dev/null +++ b/src/addons/addons/custom-block-shape/userscript.js @@ -0,0 +1,244 @@ +export default async function ({ addon, console }) { + var BlocklyInstance = await addon.tab.traps.getBlockly(); + + (function (Blockly) { + const BlockSvg = BlocklyInstance.BlockSvg; + var vm = addon.tab.traps.vm; + + const { GRID_UNIT } = BlockSvg; + + function updateAllBlocks() { + const workspace = Blockly.getMainWorkspace(); + if (workspace) { + if (vm.editingTarget) { + vm.emitWorkspaceUpdate(); + } + const flyout = workspace.getFlyout(); + if (flyout) { + const flyoutWorkspace = flyout.getWorkspace(); + Blockly.Xml.clearWorkspaceAndLoadFromXml(Blockly.Xml.workspaceToDom(flyoutWorkspace), flyoutWorkspace); + workspace.getToolbox().refreshSelection(); + workspace.toolboxRefreshEnabled_ = true; + } + } + } + + function applyChanges( + paddingSize = addon.settings.get("paddingSize"), + cornerSize = addon.settings.get("cornerSize"), + notchSize = addon.settings.get("notchSize") + ) { + let multiplier = paddingSize / 100; + cornerSize = cornerSize / 100; + notchSize = notchSize / 100; + BlockSvg.SEP_SPACE_Y = 2 * GRID_UNIT * multiplier; + BlockSvg.MIN_BLOCK_X = 16 * GRID_UNIT * multiplier; + BlockSvg.MIN_BLOCK_X_OUTPUT = 12 * GRID_UNIT * multiplier; + BlockSvg.MIN_BLOCK_X_SHADOW_OUTPUT = 10 * GRID_UNIT * multiplier; + BlockSvg.MIN_BLOCK_Y = 12 * GRID_UNIT * multiplier; + BlockSvg.EXTRA_STATEMENT_ROW_Y = 8 * GRID_UNIT * multiplier; + BlockSvg.MIN_BLOCK_X_WITH_STATEMENT = 40 * GRID_UNIT * multiplier; + BlockSvg.MIN_BLOCK_Y_SINGLE_FIELD_OUTPUT = 8 * GRID_UNIT * multiplier; + BlockSvg.MIN_BLOCK_Y_REPORTER = 10 * GRID_UNIT * multiplier; + BlockSvg.MIN_STATEMENT_INPUT_HEIGHT = 6 * GRID_UNIT * multiplier; + BlockSvg.NOTCH_WIDTH = 8 * GRID_UNIT * multiplier; + BlockSvg.NOTCH_HEIGHT = 2 * GRID_UNIT * multiplier * notchSize; + BlockSvg.NOTCH_START_PADDING = 3 * GRID_UNIT; //* multiplier + BlockSvg.ICON_SEPARATOR_HEIGHT = 10 * GRID_UNIT * multiplier; + + BlockSvg.NOTCH_PATH_LEFT = + `c 2 0 3 ${1 * notchSize} 4 ${2 * notchSize} ` + + `l ${4 * multiplier * notchSize} ${4 * multiplier * notchSize} ` + + `c 1 ${1 * notchSize} 2 ${2 * notchSize} 4 ${2 * notchSize} ` + + `h ${24 * (multiplier - 0.5)} ` + + `c 2 0 3 ${-1 * notchSize} 4 ${-2 * notchSize} ` + + `l ${4 * multiplier * notchSize} ${-4 * multiplier * notchSize} ` + + `c 1 ${-1 * notchSize} 2 ${-2 * notchSize} 4 ${-2 * notchSize} ` + BlockSvg.NOTCH_PATH_RIGHT = + `h ${(-4 * (cornerSize - 1) - 5 * (1 - notchSize))} ` + + `c -2 0 -3 ${1 * notchSize} -4 ${2 * notchSize} ` + + `l ${-4 * multiplier * notchSize} ${4 * multiplier * notchSize} ` + + `c -1 ${1 * notchSize} -2 ${2 * notchSize} -4 ${2 * notchSize} ` + + `h ${-24 * (multiplier - 0.5)} ` + + `c -2 0 -3 ${-1 * notchSize} -4 ${-2 * notchSize} ` + + `l ${-4 * multiplier * notchSize} ${-4 * multiplier * notchSize} ` + + `c -1 ${-1 * notchSize} -2 ${-2 * notchSize} -4 ${-2 * notchSize} ` + + BlockSvg.NOTCH_SWITCH_PATH_LEFT = + `c 2 0 3 ${1 * notchSize} 4 ${2 * notchSize} ` + + `l ${4 * multiplier * notchSize} ${4 * multiplier * notchSize} ` + + `c 1 ${1 * notchSize} 2 ${2 * notchSize} 4 ${2 * notchSize} ` + + `c ${4 * (multiplier - 0.5)} 0 ${8 * (multiplier - 0.5)} ${-8 * (multiplier - 0.5) * notchSize} ${12 * (multiplier - 0.5)} ${-8 * (multiplier - 0.5) * notchSize} ` + + `c ${4 * (multiplier - 0.5)} 0 ${8 * (multiplier - 0.5)} ${8 * (multiplier - 0.5) * notchSize} ${12 * (multiplier - 0.5)} ${8 * (multiplier - 0.5) * notchSize} ` + + `c 2 0 3 ${-1 * notchSize} 4 ${-2 * notchSize} ` + + `l ${4 * multiplier * notchSize} ${-4 * multiplier * notchSize} ` + + `c 1 ${-1 * notchSize} 2 ${-2 * notchSize} 4 ${-2 * notchSize} ` + BlockSvg.NOTCH_SWITCH_PATH_RIGHT = + `h ${(-4 * (cornerSize - 1) - 5 * (1 - notchSize))} ` + + `c -2 0 -3 ${1 * notchSize} -4 ${2 * notchSize} ` + + `l ${-4 * multiplier * notchSize} ${4 * multiplier * notchSize} ` + + `c -1 ${1 * notchSize} -2 ${2 * notchSize} -4 ${2 * notchSize} ` + + `c ${-4 * (multiplier - 0.5)} 0 ${-8 * (multiplier - 0.5)} ${-8 * (multiplier - 0.5) * notchSize} ${-12 * (multiplier - 0.5)} ${-8 * (multiplier - 0.5) * notchSize} ` + + `c ${-4 * (multiplier - 0.5)} 0 ${-8 * (multiplier - 0.5)} ${8 * (multiplier - 0.5) * notchSize} ${-12 * (multiplier - 0.5)} ${8 * (multiplier - 0.5) * notchSize} ` + + `c -2 0 -3 ${-1 * notchSize} -4 ${-2 * notchSize} ` + + `l ${-4 * multiplier * notchSize} ${-4 * multiplier * notchSize} ` + + `c -1 ${-1 * notchSize} -2 ${-2 * notchSize} -4 ${-2 * notchSize} ` + + BlockSvg.INPUT_SHAPE_HEXAGONAL = + "M " + + 4 * GRID_UNIT * multiplier + + ",0 " + + " h " + + 4 * GRID_UNIT + + " l " + + 4 * GRID_UNIT * multiplier + + "," + + 4 * GRID_UNIT * multiplier + + " l " + + -4 * GRID_UNIT * multiplier + + "," + + 4 * GRID_UNIT * multiplier + + " h " + + -4 * GRID_UNIT + + " l " + + -4 * GRID_UNIT * multiplier + + "," + + -4 * GRID_UNIT * multiplier + + " l " + + 4 * GRID_UNIT * multiplier + + "," + + -4 * GRID_UNIT * multiplier + + " z"; + BlockSvg.INPUT_SHAPE_HEXAGONAL_WIDTH = 12 * GRID_UNIT * multiplier; + BlockSvg.INPUT_SHAPE_ROUND = + "M " + + 4 * GRID_UNIT * multiplier + + ",0" + + " h " + + 4 * GRID_UNIT * multiplier + + " a " + + 4 * GRID_UNIT * multiplier + + " " + + 4 * GRID_UNIT * multiplier + + " 0 0 1 0 " + + 8 * GRID_UNIT * multiplier + + " h " + + -4 * GRID_UNIT * multiplier + + " a " + + 4 * GRID_UNIT * multiplier + + " " + + 4 * GRID_UNIT * multiplier + + " 0 0 1 0 -" + + 8 * GRID_UNIT * multiplier + + " z"; + BlockSvg.INPUT_SHAPE_ROUND_WIDTH = 12 * GRID_UNIT * multiplier; + BlockSvg.INPUT_SHAPE_HEIGHT = 8 * GRID_UNIT * multiplier; + BlockSvg.FIELD_HEIGHT = 8 * GRID_UNIT * multiplier; // NOTE: Determines string input heights + BlockSvg.FIELD_WIDTH = 6 * GRID_UNIT * Math.min(multiplier, 1) + 10 * GRID_UNIT * Math.max(multiplier - 1, 0); + BlockSvg.FIELD_DEFAULT_CORNER_RADIUS = 4 * GRID_UNIT * multiplier; + BlockSvg.EDITABLE_FIELD_PADDING = 1.5 * GRID_UNIT * multiplier; + BlockSvg.BOX_FIELD_PADDING = 2 * GRID_UNIT * multiplier; + BlockSvg.DROPDOWN_ARROW_PADDING = 2 * GRID_UNIT * multiplier; + BlockSvg.FIELD_WIDTH_MIN_EDIT = 8 * GRID_UNIT * multiplier; + BlockSvg.INPUT_AND_FIELD_MIN_X = 12 * GRID_UNIT * multiplier; + BlockSvg.INLINE_PADDING_Y = 1 * GRID_UNIT * multiplier; // For when reporters are inside reporters + BlockSvg.SHAPE_IN_SHAPE_PADDING[1][0] = 5 * GRID_UNIT * multiplier; + BlockSvg.SHAPE_IN_SHAPE_PADDING[1][2] = 5 * GRID_UNIT * multiplier; + BlockSvg.SHAPE_IN_SHAPE_PADDING[1][3] = 5 * GRID_UNIT * multiplier; + + var originalDropdownObject = BlocklyInstance.FieldDropdown.prototype.positionArrow; + BlocklyInstance.FieldDropdown.prototype.positionArrow = function (x) { + this.arrowY_ = 11 * multiplier; + return originalDropdownObject.call(this, x); + }; + + // Corner setting + BlockSvg.CORNER_RADIUS = (1 * GRID_UNIT * cornerSize * 100) / 100; + + BlockSvg.TOP_LEFT_CORNER_START = "m 0," + BlockSvg.CORNER_RADIUS; + + BlockSvg.TOP_LEFT_CORNER = + "A " + BlockSvg.CORNER_RADIUS + "," + BlockSvg.CORNER_RADIUS + " 0 0,1 " + BlockSvg.CORNER_RADIUS + ",0"; + + BlockSvg.TOP_RIGHT_CORNER = + "a " + + BlockSvg.CORNER_RADIUS + + "," + + BlockSvg.CORNER_RADIUS + + " 0 0,1 " + + BlockSvg.CORNER_RADIUS + + "," + + BlockSvg.CORNER_RADIUS; + + BlockSvg.BOTTOM_RIGHT_CORNER = + " a " + + BlockSvg.CORNER_RADIUS + + "," + + BlockSvg.CORNER_RADIUS + + " 0 0,1 -" + + BlockSvg.CORNER_RADIUS + + "," + + BlockSvg.CORNER_RADIUS; + + BlockSvg.BOTTOM_LEFT_CORNER = + "a " + + BlockSvg.CORNER_RADIUS + + "," + + BlockSvg.CORNER_RADIUS + + " 0 0,1 -" + + BlockSvg.CORNER_RADIUS + + ",-" + + BlockSvg.CORNER_RADIUS; + + BlockSvg.INNER_TOP_LEFT_CORNER = + " a " + + BlockSvg.CORNER_RADIUS + + "," + + BlockSvg.CORNER_RADIUS + + " 0 0,0 -" + + BlockSvg.CORNER_RADIUS + + "," + + BlockSvg.CORNER_RADIUS; + + BlockSvg.INNER_BOTTOM_LEFT_CORNER = + "a " + + BlockSvg.CORNER_RADIUS + + "," + + BlockSvg.CORNER_RADIUS + + " 0 0,0 " + + BlockSvg.CORNER_RADIUS + + "," + + BlockSvg.CORNER_RADIUS; + + BlockSvg.TOP_RIGHT_CORNER_DEFINE_HAT = + "a " + + BlockSvg.DEFINE_HAT_CORNER_RADIUS + + "," + + BlockSvg.DEFINE_HAT_CORNER_RADIUS + + " 0 0,1 " + + BlockSvg.DEFINE_HAT_CORNER_RADIUS + + "," + + BlockSvg.DEFINE_HAT_CORNER_RADIUS + + " v " + + (1 * GRID_UNIT - BlockSvg.CORNER_RADIUS); + + BlockSvg.STATEMENT_INPUT_INNER_SPACE = 2.8 * GRID_UNIT - 0.9 * GRID_UNIT * cornerSize; + } + + function applyAndUpdate(...args) { + applyChanges(...args); + updateAllBlocks(); + } + + addon.settings.addEventListener("change", () => applyAndUpdate()); + + addon.self.addEventListener("disabled", () => { + // Scratch 3.0 blocks + applyAndUpdate(100, 100, 100); + }); + + addon.self.addEventListener("reenabled", () => applyAndUpdate()); + + applyAndUpdate(); + })(window.Blockly); +} \ No newline at end of file diff --git a/src/addons/addons/custom-block-text/_manifest_entry.js b/src/addons/addons/custom-block-text/_manifest_entry.js new file mode 100644 index 0000000000000000000000000000000000000000..1de5f9d8d89270cba2b4b206be7110710fd45682 --- /dev/null +++ b/src/addons/addons/custom-block-text/_manifest_entry.js @@ -0,0 +1,52 @@ +/* generated by pull.js */ +const manifest = { + "name": "Customizable block text style", + "description": "Changes the thickness of the text on blocks and optionally adds a text shadow.", + "tags": [], + "credits": [ + { + "name": "Secret-chest" + }, + { + "name": "_nix", + "link": "https://scratch.mit.edu/users/_nix" + } + ], + "userstyles": [ + { + "url": "text-bold.css", + "if": { + "settings": { + "bold": true + } + } + }, + { + "url": "text-shadow.css", + "if": { + "settings": { + "shadow": true + } + } + } + ], + "settings": [ + { + "dynamic": true, + "name": "Bold text", + "id": "bold", + "type": "boolean", + "default": false + }, + { + "dynamic": true, + "name": "Shadow under text", + "id": "shadow", + "type": "boolean", + "default": false + } + ], + "dynamicDisable": true, + "enabledByDefault": false +}; +export default manifest; diff --git a/src/addons/addons/custom-block-text/_runtime_entry.js b/src/addons/addons/custom-block-text/_runtime_entry.js new file mode 100644 index 0000000000000000000000000000000000000000..d2f33437d176980fd7ec746abb0c2b56133f02e8 --- /dev/null +++ b/src/addons/addons/custom-block-text/_runtime_entry.js @@ -0,0 +1,7 @@ +/* generated by pull.js */ +import _css from "!css-loader!./text-bold.css"; +import _css2 from "!css-loader!./text-shadow.css"; +export const resources = { + "text-bold.css": _css, + "text-shadow.css": _css2, +}; diff --git a/src/addons/addons/custom-block-text/text-bold.css b/src/addons/addons/custom-block-text/text-bold.css new file mode 100644 index 0000000000000000000000000000000000000000..1dd8abbc51af8fff30ff9c025866e909bdd46cd3 --- /dev/null +++ b/src/addons/addons/custom-block-text/text-bold.css @@ -0,0 +1,4 @@ +.blocklyText, +.blocklyHtmlInput { + font-weight: bold; +} diff --git a/src/addons/addons/custom-block-text/text-shadow.css b/src/addons/addons/custom-block-text/text-shadow.css new file mode 100644 index 0000000000000000000000000000000000000000..5b1999c0d01c1d678437296f2b11a7d7e9063974 --- /dev/null +++ b/src/addons/addons/custom-block-text/text-shadow.css @@ -0,0 +1,5 @@ +/** Makes block text a little easier to read. **/ +.blocklyDraggable > .blocklyText, +.blocklyDraggable > g > text { + text-shadow: 1px 1px 0 rgba(0, 0, 0, 0.4); +} diff --git a/src/addons/addons/custom-zoom/_manifest_entry.js b/src/addons/addons/custom-zoom/_manifest_entry.js new file mode 100644 index 0000000000000000000000000000000000000000..7ab26c5ac91e88f0c8037881a4ec1232b3ae18bc --- /dev/null +++ b/src/addons/addons/custom-zoom/_manifest_entry.js @@ -0,0 +1,100 @@ +/* generated by pull.js */ +const manifest = { + "editorOnly": true, + "noTranslations": true, + "name": "Customizable code area zoom", + "description": "Choose custom settings for the minimum, maximum, speed, and start size of the zoom of scripts in the code area, and autohide the controls.", + "tags": [], + "credits": [ + { + "name": "ErrorGamer2000", + "link": "https://scratch.mit.edu/users/ErrorGamer2000/" + } + ], + "enabledByDefault": true, + "userscripts": [ + { + "url": "userscript.js" + } + ], + "userstyles": [ + { + "url": "style.css" + } + ], + "settings": [ + { + "dynamic": true, + "name": "Maximum Zoom (100-500%)", + "id": "maxZoom", + "type": "integer", + "min": 100, + "default": 500, + "max": 500 + }, + { + "dynamic": true, + "name": "Minimum Zoom (1-100%)", + "id": "minZoom", + "type": "integer", + "min": 1, + "default": 1, + "max": 100 + }, + { + "dynamic": true, + "name": "Start Zoom (50-500%)", + "id": "startZoom", + "type": "integer", + "min": 50, + "default": 68, + "max": 500 + }, + { + "dynamic": true, + "name": "Zoom Speed (50-200%)", + "id": "zoomSpeed", + "type": "integer", + "min": 50, + "default": 100, + "max": 200 + }, + { + "name": "Autohide Zoom Controls", + "id": "autohide", + "type": "boolean", + "default": false + }, + { + "dynamic": true, + "name": "Autohide Animation Speed", + "id": "speed", + "type": "select", + "potentialValues": [ + { + "id": "none", + "name": "Instant" + }, + { + "id": "short", + "name": "Quick" + }, + { + "id": "default", + "name": "Default" + }, + { + "id": "long", + "name": "Slow" + } + ], + "default": "default", + "if": { + "settings": { + "autohide": true + } + } + } + ] +}; +export default manifest; diff --git a/src/addons/addons/custom-zoom/_runtime_entry.js b/src/addons/addons/custom-zoom/_runtime_entry.js new file mode 100644 index 0000000000000000000000000000000000000000..76c9ca1f43154011942db097b82ae033d913de82 --- /dev/null +++ b/src/addons/addons/custom-zoom/_runtime_entry.js @@ -0,0 +1,7 @@ +/* generated by pull.js */ +import _js from "./userscript.js"; +import _css from "!css-loader!./style.css"; +export const resources = { + "userscript.js": _js, + "style.css": _css, +}; diff --git a/src/addons/addons/custom-zoom/style.css b/src/addons/addons/custom-zoom/style.css new file mode 100644 index 0000000000000000000000000000000000000000..c85fb2d3927a519a5cbdb0d805392ba0cb619ef4 --- /dev/null +++ b/src/addons/addons/custom-zoom/style.css @@ -0,0 +1,14 @@ +.sa-custom-zoom-area { + position: absolute; + bottom: 0; + right: 0; + width: 60px; + height: 148px; + pointer-events: none; +} +.blocklyZoom > * { + transition: transform var(--sa-custom-zoom-speed, 0) ease-in-out; +} +.sa-custom-zoom-hidden > * { + transform: translateX(80px); +} diff --git a/src/addons/addons/custom-zoom/userscript.js b/src/addons/addons/custom-zoom/userscript.js new file mode 100644 index 0000000000000000000000000000000000000000..0afa2ece0e6f2f7c5450246c63d1c8f9b8b99d61 --- /dev/null +++ b/src/addons/addons/custom-zoom/userscript.js @@ -0,0 +1,71 @@ +export default async function ({ addon, console }) { + await addon.tab.traps.getBlockly(); + + let controlsRect; + let previousIsHovered = false; + const speeds = { + none: "0s", + short: "0.2s", + default: "0.3s", + long: "0.5s", + }; + + const customZoomAreaElement = document.createElement("div"); + customZoomAreaElement.className = "sa-custom-zoom-area"; + + function update() { + document.removeEventListener("mousemove", onMouseMove); + + if (addon.tab.editorMode !== "editor") return; + + Blockly.getMainWorkspace().options.zoomOptions.maxScale = addon.settings.get("maxZoom") / 100; + Blockly.getMainWorkspace().options.zoomOptions.minScale = addon.settings.get("minZoom") / 100; + Blockly.getMainWorkspace().options.zoomOptions.startScale = addon.settings.get("startZoom") / 100; + Blockly.getMainWorkspace().options.zoomOptions.scaleSpeed = 1 + 0.2 * (addon.settings.get("zoomSpeed") / 100); + + const svgGroup = getZoomControls(); + const autohide = addon.settings.get("autohide"); + if (svgGroup) svgGroup.classList.toggle("sa-custom-zoom-hidden", autohide); + if (autohide) { + const injectionDiv = document.querySelector(".injectionDiv"); + injectionDiv.appendChild(customZoomAreaElement); + updateRect(); + document.addEventListener("mousemove", onMouseMove); + } + } + + function getZoomControls() { + const zoomControls = Blockly.getMainWorkspace().zoomControls_; + if (zoomControls) return zoomControls.svgGroup_; + return null; + } + + function onMouseMove(e) { + const isHovered = + e.x > controlsRect.left && e.x < controlsRect.right && e.y > controlsRect.top && e.y < controlsRect.bottom; + if (isHovered !== previousIsHovered) { + previousIsHovered = isHovered; + const svgGroup = getZoomControls(); + if (svgGroup) { + svgGroup.style.setProperty("--sa-custom-zoom-speed", speeds[addon.settings.get("speed")]); + svgGroup.classList.toggle("sa-custom-zoom-hidden", !isHovered); + } + } + } + + function updateRect() { + controlsRect = customZoomAreaElement.getBoundingClientRect(); + } + + function onResize() { + if (addon.tab.editorMode === "editor" && addon.settings.get("autohide")) { + updateRect(); + } + } + + await addon.tab.waitForElement(".blocklyZoom"); + update(); + addon.tab.addEventListener("urlChange", update); + addon.settings.addEventListener("change", update); + window.addEventListener("resize", onResize); +} diff --git a/src/addons/addons/debug-console/_manifest_entry.js b/src/addons/addons/debug-console/_manifest_entry.js new file mode 100644 index 0000000000000000000000000000000000000000..3c1345d1e0ae51e1151bec12d69333aab6f10e9c --- /dev/null +++ b/src/addons/addons/debug-console/_manifest_entry.js @@ -0,0 +1,17 @@ +/* generated by pull.js */ +const manifest = { + "name": "Developer JS Console", + "description": "開発者用のJavascriptコンソール。これが何か分からない場合は無視してください。", + "tags": [ + "recommended" + ], + "userscripts": [ + { + "url": "userscript.js" + } + ], + "enabledByDefault": true +}; +import {mediaRecorderSupported} from "../../environment"; +if (!mediaRecorderSupported) manifest.unsupported = true; +export default manifest; \ No newline at end of file diff --git a/src/addons/addons/debug-console/_runtime_entry.js b/src/addons/addons/debug-console/_runtime_entry.js new file mode 100644 index 0000000000000000000000000000000000000000..48eea3fb252812d71ab3361cad82b482db87287e --- /dev/null +++ b/src/addons/addons/debug-console/_runtime_entry.js @@ -0,0 +1,7 @@ +/* generated by pull.js */ +import _js from "./userscript.js"; +import _css from "!css-loader!./style.css"; +export const resources = { + "userscript.js": _js, + "style.css": _css, +}; \ No newline at end of file diff --git a/src/addons/addons/debug-console/style.css b/src/addons/addons/debug-console/style.css new file mode 100644 index 0000000000000000000000000000000000000000..355634f8078b75b8aff8b369511f49aa2dccb022 --- /dev/null +++ b/src/addons/addons/debug-console/style.css @@ -0,0 +1,55 @@ +.mediaRecorderPopup { + box-sizing: border-box; + width: 700px; + max-height: min(800px, 80vh); + max-width: 85%; + margin-top: 12vh; + overflow-y: auto; + margin-left: auto; + margin-right: auto; +} + +.mediaRecorderPopupContent { + padding: 1.5rem 2.25rem; +} + +.mediaRecorderPopup p { + font-size: 1rem; + margin: 0.5rem auto; +} + +.mediaRecorderPopup p :last-child { + margin-left: 1rem; +} + +.mediaRecorderPopup[dir="rtl"] p :last-child { + margin-left: 0; + margin-right: 1rem; +} + +p.mediaRecorderPopupOption { + display: flex; + align-items: center; +} + +.mediaRecorderPopupOption input[type="checkbox"] { + height: 1.5rem; +} + +#recordOptionSecondsInput, +#recordOptionDelayInput { + width: 6rem; +} + +.mediaRecorderPopupButtons { + margin-top: 1.5rem; +} + +.mediaRecorderPopupButtons button { + margin-left: 0.5rem; +} + +/* TW: Fixes cancel button in dark mode */ +.mediaRecorderPopupButtons button:nth-of-type(1) { + color: black; +} \ No newline at end of file diff --git a/src/addons/addons/debug-console/userscript.js b/src/addons/addons/debug-console/userscript.js new file mode 100644 index 0000000000000000000000000000000000000000..847406b899bc737ab2b2344f6f657062b9ad17e6 --- /dev/null +++ b/src/addons/addons/debug-console/userscript.js @@ -0,0 +1,11 @@ +export default async ({ addon, console, msg }) => { + // ページ読み込み直後にerudaを読み込む + if (!window.eruda) { + const script = document.createElement('script'); + script.src = 'https://soiz1-eruda3.hf.space/eruda.js'; + script.onload = () => { + eruda.init(); + }; + document.body.appendChild(script); + } +}; diff --git a/src/addons/addons/debugger/_manifest_entry.js b/src/addons/addons/debugger/_manifest_entry.js new file mode 100644 index 0000000000000000000000000000000000000000..c8ef9a4e87e0c24ec4d079a0332e36e25478d0f2 --- /dev/null +++ b/src/addons/addons/debugger/_manifest_entry.js @@ -0,0 +1,76 @@ +/* generated by pull.js */ +const manifest = { + "editorOnly": true, + "name": "Debugger", + "description": "Adds a new \"debugger\" window to the editor. Allows for logging into the \"Logs\" tab of the debugger window using the \"log\", \"warn\" and \"error\" blocks.", + "credits": [ + { + "name": "Tacodiva", + "link": "https://scratch.mit.edu/users/Tacodiva7729/" + }, + { + "name": "GarboMuffin" + }, + { + "name": "GrahamSH" + }, + { + "name": "TheColaber" + }, + { + "name": "retronbv" + } + ], + "userscripts": [ + { + "url": "userscript.js" + } + ], + "userstyles": [ + { + "url": "style.css" + } + ], + "settings": [ + { + "dynamic": true, + "name": "Clear logs on green flag", + "id": "log_clear_greenflag", + "type": "boolean", + "default": false + }, + { + "dynamic": true, + "name": "Log green flag clicks", + "id": "log_greenflag", + "type": "boolean", + "default": false + }, + { + "dynamic": true, + "name": "Log clone creation", + "id": "log_clone_create", + "type": "boolean", + "default": false + }, + { + "dynamic": true, + "name": "Log when max clones exceeded", + "id": "log_failed_clone_creation", + "type": "boolean", + "default": true + }, + { + "dynamic": true, + "name": "Log broadcasts", + "id": "log_broadcasts", + "type": "boolean", + "default": false + } + ], + "tags": [ + "beta" + ], + "enabledByDefault": false +}; +export default manifest; diff --git a/src/addons/addons/debugger/_runtime_entry.js b/src/addons/addons/debugger/_runtime_entry.js new file mode 100644 index 0000000000000000000000000000000000000000..303ef4785d0455e8fac10c88b1eb760db239a06b --- /dev/null +++ b/src/addons/addons/debugger/_runtime_entry.js @@ -0,0 +1,31 @@ +/* generated by pull.js */ +import _js from "./userscript.js"; +import _css from "!css-loader!./style.css"; +import _asset from "!url-loader!./icons/close.svg"; +import _asset2 from "!url-loader!./icons/debug.svg"; +import _asset3 from "!url-loader!./icons/delete.svg"; +import _asset4 from "!url-loader!./icons/download-white.svg"; +import _asset5 from "!url-loader!./icons/error.svg"; +import _asset6 from "!url-loader!./icons/logs.svg"; +import _asset7 from "!url-loader!./icons/performance.svg"; +import _asset8 from "!url-loader!./icons/play.svg"; +import _asset9 from "!url-loader!./icons/step.svg"; +import _asset10 from "!url-loader!./icons/subthread.svg"; +import _asset11 from "!url-loader!./icons/threads.svg"; +import _asset12 from "!url-loader!./icons/warning.svg"; +export const resources = { + "userscript.js": _js, + "style.css": _css, + "icons/close.svg": _asset, + "icons/debug.svg": _asset2, + "icons/delete.svg": _asset3, + "icons/download-white.svg": _asset4, + "icons/error.svg": _asset5, + "icons/logs.svg": _asset6, + "icons/performance.svg": _asset7, + "icons/play.svg": _asset8, + "icons/step.svg": _asset9, + "icons/subthread.svg": _asset10, + "icons/threads.svg": _asset11, + "icons/warning.svg": _asset12, +}; diff --git a/src/addons/addons/debugger/icons/close.svg b/src/addons/addons/debugger/icons/close.svg new file mode 100644 index 0000000000000000000000000000000000000000..af929487975597dc5c21f51e77b6326bb1df7ca1 Binary files /dev/null and b/src/addons/addons/debugger/icons/close.svg differ diff --git a/src/addons/addons/debugger/icons/debug.svg b/src/addons/addons/debugger/icons/debug.svg new file mode 100644 index 0000000000000000000000000000000000000000..c18edd262b5efae51455560da2e01c3e164d0aff Binary files /dev/null and b/src/addons/addons/debugger/icons/debug.svg differ diff --git a/src/addons/addons/debugger/icons/delete.svg b/src/addons/addons/debugger/icons/delete.svg new file mode 100644 index 0000000000000000000000000000000000000000..d91a801d876b555cd1b1e52287bea82cad28ef05 Binary files /dev/null and b/src/addons/addons/debugger/icons/delete.svg differ diff --git a/src/addons/addons/debugger/icons/download-white.svg b/src/addons/addons/debugger/icons/download-white.svg new file mode 100644 index 0000000000000000000000000000000000000000..64938b5ab1c7cba25c53dabba092ceeb64648e6f Binary files /dev/null and b/src/addons/addons/debugger/icons/download-white.svg differ diff --git a/src/addons/addons/debugger/icons/error.svg b/src/addons/addons/debugger/icons/error.svg new file mode 100644 index 0000000000000000000000000000000000000000..dee8193aad53bc63d7a377e4f3002dd936b024b0 Binary files /dev/null and b/src/addons/addons/debugger/icons/error.svg differ diff --git a/src/addons/addons/debugger/icons/logs.svg b/src/addons/addons/debugger/icons/logs.svg new file mode 100644 index 0000000000000000000000000000000000000000..9483b736a66c633bf37f8a52745cbec2a397b7bf Binary files /dev/null and b/src/addons/addons/debugger/icons/logs.svg differ diff --git a/src/addons/addons/debugger/icons/performance.svg b/src/addons/addons/debugger/icons/performance.svg new file mode 100644 index 0000000000000000000000000000000000000000..d139613d0afe9aadbeeed3615b3b67cf65ae1ae4 Binary files /dev/null and b/src/addons/addons/debugger/icons/performance.svg differ diff --git a/src/addons/addons/debugger/icons/play.svg b/src/addons/addons/debugger/icons/play.svg new file mode 100644 index 0000000000000000000000000000000000000000..d03e747d3c7f45714f3d7ed082e72522e04a5b5a Binary files /dev/null and b/src/addons/addons/debugger/icons/play.svg differ diff --git a/src/addons/addons/debugger/icons/step.svg b/src/addons/addons/debugger/icons/step.svg new file mode 100644 index 0000000000000000000000000000000000000000..0ace738530ac5b881edca11b8ca35a8d94723050 Binary files /dev/null and b/src/addons/addons/debugger/icons/step.svg differ diff --git a/src/addons/addons/debugger/icons/subthread.svg b/src/addons/addons/debugger/icons/subthread.svg new file mode 100644 index 0000000000000000000000000000000000000000..784e1d1cf71da6b178a62bc37e50ab8cb6341cf2 Binary files /dev/null and b/src/addons/addons/debugger/icons/subthread.svg differ diff --git a/src/addons/addons/debugger/icons/threads.svg b/src/addons/addons/debugger/icons/threads.svg new file mode 100644 index 0000000000000000000000000000000000000000..938dd32482ab60dcb1045e8f57bea936c0c4a2b5 Binary files /dev/null and b/src/addons/addons/debugger/icons/threads.svg differ diff --git a/src/addons/addons/debugger/icons/warning.svg b/src/addons/addons/debugger/icons/warning.svg new file mode 100644 index 0000000000000000000000000000000000000000..eeaba83fdfbf1c553c1ecd4fc3081582fa8deb92 Binary files /dev/null and b/src/addons/addons/debugger/icons/warning.svg differ diff --git a/src/addons/addons/debugger/log-view.js b/src/addons/addons/debugger/log-view.js new file mode 100644 index 0000000000000000000000000000000000000000..2bbc1f93630a85aae6c4269517bb824273384187 --- /dev/null +++ b/src/addons/addons/debugger/log-view.js @@ -0,0 +1,231 @@ +const clamp = (i, min, max) => Math.max(min, Math.min(max, i)); + +const appendSortedElement = (parent, newChild) => { + const newChildIndex = +newChild.dataset.index; + let foundSpot = false; + for (const existingChild of parent.children) { + const existingChildIndex = +existingChild.dataset.index; + if (existingChildIndex > newChildIndex) { + foundSpot = true; + parent.insertBefore(newChild, existingChild); + break; + } + } + if (!foundSpot) { + parent.appendChild(newChild); + } +}; + +/** + * LogView: A virtualized row viewer. + * It efficiently manages row rendering and scrolling. + * + * 1. .logs is the place where all the rows live. This is an array of any arbitrary object. + * 2. Implement generateRow(row). This takes a row from .logs as an argument. This should return + * an object with a bunch of DOM elements on it. The "root" property must be set, nothing else + * is required. This is called when a row becomes visible. It can be called any number of times. + * This is where you should setup elements that are immutable for a given row. LogView will + * move the root element to the right spot for you. + * 3. Implement renderRow(elements, row). This will be called with the result returned by + * generateRow() and the row in .logs any time a row is changed, including the first render. + * It can be called any number of times. This is where you should update any dynamic elements. + * 4. Whenever you update .logs without using the helper methods such as append(), call + * queueUpdateContent(). + */ +class LogView { + constructor() { + this.rows = []; + this.canAutoScrollToEnd = true; + this.rowHeight = 20; + + this.outerElement = document.createElement("div"); + this.outerElement.className = "sa-debugger-log-outer"; + + this.innerElement = document.createElement("div"); + this.innerElement.className = "sa-debugger-log-inner"; + this.outerElement.appendChild(this.innerElement); + this.innerElement.addEventListener("scroll", this._handleScroll.bind(this), { passive: true }); + this.innerElement.addEventListener("wheel", this._handleWheel.bind(this), { passive: true }); + + this.endElement = document.createElement("div"); + this.endElement.className = "sa-debugger-log-end"; + this.endElement.dataset.index = "-1"; + this.innerElement.appendChild(this.endElement); + + this.placeholderElement = document.createElement("div"); + this.placeholderElement.className = "sa-debugger-log-empty"; + + this.visible = false; + this.isScrolledToEnd = true; + this.scrollTopWhenHidden = "end"; + this.scrollTop = 0; + this.updateContentQueued = false; + this.scrollToEndQueued = false; + this.oldLength = -1; + this.rowToMetadata = new Map(); + } + + append(log) { + this.queueUpdateContent(); + this._queueScrollToEnd(); + + this.rows.push(log); + + const MAX_LOGS = 200000; + while (this.rows.length > MAX_LOGS) { + this.rows.shift(); + } + } + + clear() { + this.rows.length = 0; + this.scrollTop = 0; + this.isScrolledToEnd = true; + this.queueUpdateContent(); + } + + show() { + this.visible = true; + this.height = this.innerElement.offsetHeight; + this.queueUpdateContent(); + if (this.scrollTopWhenHidden === "end") { + this._queueScrollToEnd(); + } else { + this.innerElement.scrollTop = this.scrollTopWhenHidden; + } + } + + hide() { + this.visible = false; + this.scrollTopWhenHidden = this.isScrolledToEnd ? "end" : this.scrollTop; + } + + _handleScroll(e) { + this.scrollTop = e.target.scrollTop; + this.isScrolledToEnd = e.target.scrollTop + 5 >= e.target.scrollHeight - e.target.clientHeight; + this.queueUpdateContent(); + } + + _handleWheel(e) { + if (e.deltaY < 0) { + this.isScrolledToEnd = false; + } + } + + scrollIntoView(index) { + const distanceFromTop = index * this.rowHeight; + const viewportStart = this.scrollTop; + const viewportEnd = this.scrollTop + this.height; + const isInView = distanceFromTop > viewportStart && distanceFromTop < viewportEnd; + if (!isInView) { + this.scrollTop = distanceFromTop; + this.innerElement.scrollTop = distanceFromTop; + } + } + + _queueScrollToEnd() { + if (this.visible && this.canAutoScrollToEnd && this.isScrolledToEnd && !this.scrollToEndQueued) { + this.scrollToEndQueued = true; + queueMicrotask(() => { + this.scrollToEndQueued = false; + if (this.isScrolledToEnd) { + const scrollEnd = this.innerElement.scrollHeight - this.innerElement.offsetHeight; + this.innerElement.scrollTop = scrollEnd; + this.scrollTop = scrollEnd; + } + }); + } + } + + queueUpdateContent() { + if (this.visible && !this.updateContentQueued) { + this.updateContentQueued = true; + queueMicrotask(() => { + this.updateContentQueued = false; + this.updateContent(); + }); + } + } + + generateRow(row) { + // to be implemented by users + } + + renderRow(elements, row) { + // to be implemented by users + } + + updateContent() { + if (this.rows.length !== this.oldLength) { + this.oldLength = this.rows.length; + + const totalHeight = this.rows.length * this.rowHeight; + this.endElement.style.transform = `translateY(${totalHeight}px)`; + + if (this.rows.length) { + this.placeholderElement.remove(); + } else { + this.innerElement.appendChild(this.placeholderElement); + + for (const metadata of this.rowToMetadata.values()) { + metadata.elements.root.remove(); + } + this.rowToMetadata.clear(); + } + } + + if (this.rows.length === 0) { + return; + } + + // For better compatibility with asynchronous scrolling, we'll render a few extra rows in either direction. + const EXTRA_ROWS_ABOVE = 5; + const EXTRA_ROWS_BELOW = 5; + + const scrollStartIndex = Math.floor(this.scrollTop / this.rowHeight); + const rowsVisible = Math.ceil(this.height / this.rowHeight); + const startIndex = clamp(scrollStartIndex - EXTRA_ROWS_BELOW, 0, this.rows.length); + const endIndex = clamp(scrollStartIndex + rowsVisible + EXTRA_ROWS_ABOVE, 0, this.rows.length); + + const allVisibleRows = new Set(); + const newElements = []; + for (let i = startIndex; i < endIndex; i++) { + const row = this.rows[i]; + allVisibleRows.add(row); + + let metadata = this.rowToMetadata.get(row); + if (!metadata) { + const elements = this.generateRow(row); + newElements.push(elements.root); + metadata = { + stringify: null, + elements, + }; + this.rowToMetadata.set(row, metadata); + } + + const currentStringify = JSON.stringify(row); + if (currentStringify !== metadata.stringify) { + metadata.stringify = currentStringify; + this.renderRow(metadata.elements, row); + } + + const root = metadata.elements.root; + root.style.transform = `translateY(${i * this.rowHeight}px)`; + root.dataset.index = i; + } + + for (const [row, metadata] of this.rowToMetadata.entries()) { + if (!allVisibleRows.has(row)) { + metadata.elements.root.remove(); + this.rowToMetadata.delete(row); + } + } + + for (const root of newElements) { + appendSortedElement(this.innerElement, root); + } + } +} + +export default LogView; diff --git a/src/addons/addons/debugger/logs.js b/src/addons/addons/debugger/logs.js new file mode 100644 index 0000000000000000000000000000000000000000..4f14382331d4e9453ab647f743f5fa977988b49b --- /dev/null +++ b/src/addons/addons/debugger/logs.js @@ -0,0 +1,191 @@ +import downloadBlob from "../../libraries/common/cs/download-blob.js"; +import LogView from "./log-view.js"; + +export default async function createLogsTab({ debug, addon, console, msg }) { + const vm = addon.tab.traps.vm; + + const tab = debug.createHeaderTab({ + text: msg("tab-logs"), + icon: addon.self.getResource("/icons/logs.svg") /* rewritten by pull.js */, + }); + + const logView = new LogView(); + logView.placeholderElement.textContent = msg("no-logs"); + + const getInputOfBlock = (targetId, blockId) => { + const target = vm.runtime.getTargetById(targetId); + if (!target) { + return null; + } + const block = debug.getBlock(target, blockId); + if (!block) { + return null; + } + return Object.values(block.inputs)[0]?.block; + }; + + logView.generateRow = (row) => { + const root = document.createElement("div"); + root.className = "sa-debugger-log"; + if (row.internal) { + root.classList.add("sa-debugger-log-internal"); + } + root.dataset.type = row.type; + + const icon = document.createElement("div"); + icon.className = "sa-debugger-log-icon"; + if (row.type === "warn" || row.type === "error") { + icon.title = msg("icon-" + row.type); + } + root.appendChild(icon); + + const repeats = document.createElement("div"); + repeats.className = "sa-debugger-log-repeats"; + repeats.style.display = "none"; + root.appendChild(repeats); + + if (row.preview && row.blockId && row.targetInfo) { + const originalId = row.targetInfo.originalId; + const inputBlock = getInputOfBlock(originalId, row.blockId); + if (inputBlock) { + const preview = debug.createBlockPreview(originalId, inputBlock); + if (preview) { + root.appendChild(preview); + } + } + } + + const text = document.createElement("div"); + text.className = "sa-debugger-log-text"; + if (row.text.length === 0) { + text.classList.add("sa-debugger-log-text-empty"); + text.textContent = msg("empty-string"); + } else { + text.textContent = row.text; + text.title = row.text; + } + root.appendChild(text); + + if (row.targetInfo && row.blockId) { + root.appendChild(debug.createBlockLink(row.targetInfo, row.blockId)); + } + + return { + root, + repeats, + }; + }; + + logView.renderRow = (elements, row) => { + const { repeats } = elements; + if (row.count > 1) { + repeats.style.display = ""; + repeats.textContent = row.count; + } + }; + + const exportButton = debug.createHeaderButton({ + text: msg("export"), + icon: addon.self.getResource("/icons/download-white.svg") /* rewritten by pull.js */, + description: msg("export-desc"), + }); + const downloadText = (filename, text) => { + downloadBlob(filename, new Blob([text], { type: "text/plain" })); + }; + exportButton.element.addEventListener("click", async (e) => { + const defaultFormat = "{sprite}: {content} ({type})"; + const exportFormat = e.shiftKey + ? await addon.tab.prompt(msg("export"), msg("enter-format"), defaultFormat, { useEditorClasses: true }) + : defaultFormat; + if (!exportFormat) return; + const file = logView.rows + .map(({ text, targetInfo, type, count }) => + ( + exportFormat.replace( + /\{(sprite|type|content)\}/g, + (_, match) => + ({ + sprite: targetInfo ? targetInfo.name : msg("unknown-sprite"), + type, + content: text, + }[match]) + ) + "\n" + ).repeat(count) + ) + .join(""); + downloadText("logs.txt", file); + }); + + const trashButton = debug.createHeaderButton({ + text: msg("clear"), + icon: addon.self.getResource("/icons/delete.svg") /* rewritten by pull.js */, + }); + trashButton.element.addEventListener("click", () => { + clearLogs(); + }); + + const areLogsEqual = (a, b) => + a.text === b.text && + a.type === b.type && + a.internal === b.internal && + a.blockId === b.blockId && + a.targetId === b.targetId; + + const addLog = (text, thread, type) => { + const log = { + text, + type, + count: 1, + preview: true, + }; + if (thread) { + log.blockId = thread.peekStack ? thread.peekStack() : thread.thread.peekStack(); + const targetId = thread.target.id; + log.targetId = targetId; + log.targetInfo = debug.getTargetInfoById(targetId); + } + if (type === "internal") { + log.internal = true; + log.preview = false; + log.type = "log"; + } + if (type === "internal-warn") { + log.internal = true; + log.type = "warn"; + } + + const previousLog = logView.rows[logView.rows.length - 1]; + if (previousLog && areLogsEqual(log, previousLog)) { + previousLog.count++; + logView.queueUpdateContent(); + } else { + logView.append(log); + } + + if (!logView.visible && !log.internal) { + debug.setHasUnreadMessage(true); + } + }; + + const clearLogs = () => { + logView.clear(); + }; + + const show = () => { + logView.show(); + debug.setHasUnreadMessage(false); + }; + const hide = () => { + logView.hide(); + }; + + return { + tab, + content: logView.outerElement, + buttons: [exportButton, trashButton], + show, + hide, + addLog, + clearLogs, + }; +} diff --git a/src/addons/addons/debugger/module.js b/src/addons/addons/debugger/module.js new file mode 100644 index 0000000000000000000000000000000000000000..94df147878bb5cf35b02090c8d068eb3eda1181b --- /dev/null +++ b/src/addons/addons/debugger/module.js @@ -0,0 +1,424 @@ +import EventTarget from "../../event-target.js"; /* inserted by pull.js */ + +// https://github.com/LLK/scratch-vm/blob/bb352913b57991713a5ccf0b611fda91056e14ec/src/engine/thread.js#L198 +const STATUS_RUNNING = 0; +const STATUS_PROMISE_WAIT = 1; +const STATUS_YIELD = 2; +const STATUS_YIELD_TICK = 3; +const STATUS_DONE = 4; + +let vm; + +let paused = false; +let pausedThreadState = new WeakMap(); +let pauseNewThreads = false; + +let steppingThread = null; + +const eventTarget = new EventTarget(); + +let audioContextStateChange = Promise.resolve(); + +export const isPaused = () => paused; + +const pauseThread = (thread) => { + if (thread.updateMonitor || pausedThreadState.has(thread)) { + // Thread is already paused or shouldn't be paused. + return; + } + + const pauseState = { + time: vm.runtime.currentMSecs, + status: thread.status, + }; + pausedThreadState.set(thread, pauseState); + + // Pausing a thread now works by just setting its status to STATUS_PROMISE_WAIT. + // At the start of each frame, we make sure each paused thread is still paused. + // This is really the best way to implement this. + // Converting thread.status into a getter/setter causes Scratch's sequencer to permanently + // perform significantly slower in some projects. I think this is because it causes some + // very hot functions to be deoptimized. + // Trapping sequencer.stepThread to no-op for a paused thread causes Scratch's sequencer + // to waste 24ms of CPU time every frame because it thinks a thread is running. + thread.status = STATUS_PROMISE_WAIT; +}; + +const ensurePausedThreadIsStillPaused = (thread) => { + if (thread.status === STATUS_DONE) { + // If a paused thread is finished by single stepping, let it keep being done. + return; + } + const pauseState = pausedThreadState.get(thread); + if (pauseState) { + if (thread.status !== STATUS_PROMISE_WAIT) { + // We'll record the change so we can properly resume the thread, but the thread must still be paused for now. + pauseState.status = thread.status; + thread.status = STATUS_PROMISE_WAIT; + } + } +}; + +const setSteppingThread = (thread) => { + steppingThread = thread; +}; + +const compensateForTimePassedWhilePaused = (thread, pauseState) => { + // TW: Compiled threads store their timer in a different place. + if (thread.timer) { + thread.timer.startTime += vm.runtime.currentMSecs - pauseState.time; + } + const stackFrame = thread.peekStackFrame(); + if (stackFrame && stackFrame.executionContext && stackFrame.executionContext.timer) { + stackFrame.executionContext.timer.startTime += vm.runtime.currentMSecs - pauseState.time; + } +}; + +const stepUnsteppedThreads = (lastSteppedThread) => { + // If we paused in the middle of a tick, we need to make sure to step the scripts that didn't get + // stepped in that tick to avoid affecting project behavior. + const threads = vm.runtime.threads; + const startingIndex = getThreadIndex(lastSteppedThread); + if (startingIndex !== -1) { + for (let i = startingIndex; i < threads.length; i++) { + const thread = threads[i]; + const status = thread.status; + if (status === STATUS_RUNNING || status === STATUS_YIELD || status === STATUS_YIELD_TICK) { + vm.runtime.sequencer.activeThread = thread; + vm.runtime.sequencer.stepThread(thread); + } + } + } +}; + +export const setPaused = (_paused) => { + const didChange = paused !== _paused; + if (didChange) { + paused = _paused; + eventTarget.dispatchEvent(new CustomEvent("change")); + } + + // Don't check didChange as new threads could've started that we need to pause. + if (paused) { + audioContextStateChange = audioContextStateChange.then(() => { + return vm.runtime.audioEngine.audioContext.suspend(); + }); + if (!vm.runtime.ioDevices.clock._paused) { + vm.runtime.ioDevices.clock.pause(); + } + vm.runtime.threads.forEach(pauseThread); + + const activeThread = vm.runtime.sequencer.activeThread; + if (activeThread) { + setSteppingThread(activeThread); + eventTarget.dispatchEvent(new CustomEvent("step")); + } + } + + // Only run unpausing logic when pause state changed to avoid unnecessary work + if (!paused && didChange) { + audioContextStateChange = audioContextStateChange.then(() => { + return vm.runtime.audioEngine.audioContext.resume(); + }); + vm.runtime.ioDevices.clock.resume(); + for (const thread of vm.runtime.threads) { + const pauseState = pausedThreadState.get(thread); + if (pauseState) { + compensateForTimePassedWhilePaused(thread, pauseState); + thread.status = pauseState.status; + } + } + pausedThreadState = new WeakMap(); + + const lastSteppedThread = steppingThread; + // This must happen after the "change" event is fired to fix https://github.com/ScratchAddons/ScratchAddons/issues/4281 + stepUnsteppedThreads(lastSteppedThread); + steppingThread = null; + } +}; + +export const onPauseChanged = (listener) => { + eventTarget.addEventListener("change", () => listener(paused)); +}; + +export const onSingleStep = (listener) => { + eventTarget.addEventListener("step", listener); +}; + +export const getRunningThread = () => steppingThread; + +// A modified version of this function +// https://github.com/LLK/scratch-vm/blob/0e86a78a00db41af114df64255e2cd7dd881329f/src/engine/sequencer.js#L179 +// Returns if we should continue executing this thread. +const singleStepThread = (thread) => { + if (thread.status === STATUS_DONE) { + return false; + } + // TW: Can't single-step compiled threads + if (thread.isCompiled) { + return false; + } + + const currentBlockId = thread.peekStack(); + if (!currentBlockId) { + thread.popStack(); + + if (thread.stack.length === 0) { + thread.status = STATUS_DONE; + return false; + } + } + + pauseNewThreads = true; + vm.runtime.sequencer.activeThread = thread; + + /* + We need to call execute(this, thread) like the original sequencer. We don't + have access to that method, so we need to force the original stepThread to run + execute for us then exit before it tries to run more blocks. + So, we make `thread.blockGlowInFrame = ...` throw an exception, so this line: + https://github.com/LLK/scratch-vm/blob/bb352913b57991713a5ccf0b611fda91056e14ec/src/engine/sequencer.js#L214 + will end the function early. We then have to set it back to normal afterward. + + Why are we here just to suffer? + */ + const specialError = ["special error used by Scratch Addons for implementing single-stepping"]; + Object.defineProperty(thread, "blockGlowInFrame", { + set(_block) { + throw specialError; + }, + }); + + try { + thread.status = STATUS_RUNNING; + + // Restart the warp timer on each step. + // If we don't do this, Scratch will think a lot of time has passed and may yield this thread. + if (thread.warpTimer) { + thread.warpTimer.start(); + } + + try { + vm.runtime.sequencer.stepThread(thread); + } catch (err) { + if (err !== specialError) throw err; + } + + if (thread.status !== STATUS_RUNNING) { + return false; + } + + if (thread.peekStack() === currentBlockId) { + thread.goToNextBlock(); + } + + while (!thread.peekStack()) { + thread.popStack(); + + if (thread.stack.length === 0) { + thread.status = STATUS_DONE; + return false; + } + + const stackFrame = thread.peekStackFrame(); + + if (stackFrame.isLoop) { + if (thread.peekStackFrame().warpMode) { + continue; + } else { + return false; + } + } else if (stackFrame.waitingReporter) { + return false; + } + + thread.goToNextBlock(); + } + + return true; + } finally { + pauseNewThreads = false; + vm.runtime.sequencer.activeThread = null; + Object.defineProperty(thread, "blockGlowInFrame", { + value: currentBlockId, + configurable: true, + enumerable: true, + writable: true, + }); + + // Strictly this doesn't seem to be necessary, but let's make sure the thread is still paused after we step it. + if (thread.status !== STATUS_DONE) { + thread.status = STATUS_PROMISE_WAIT; + } + } +}; + +const getRealStatus = (thread) => { + const pauseState = pausedThreadState.get(thread); + if (pauseState) { + return pauseState.status; + } + return thread.status; +}; + +const getThreadIndex = (thread) => { + // We can't use vm.runtime.threads.indexOf(thread) because threads can be restarted. + // This can happens when, for example, a "when I receive message1" script broadcasts message1. + // The object in runtime.threads is replaced when this happens. + if (!thread) return -1; + return vm.runtime.threads.findIndex( + (otherThread) => + otherThread.target === thread.target && + otherThread.topBlock === thread.topBlock && + otherThread.stackClick === thread.stackClick && + otherThread.updateMonitor === thread.updateMonitor + ); +}; + +const findNewSteppingThread = (startingIndex) => { + const threads = vm.runtime.threads; + for (let i = startingIndex; i < threads.length; i++) { + const possibleNewThread = threads[i]; + if (possibleNewThread.updateMonitor) { + // Never single-step monitor update threads. + continue; + } + // TW: Can't single-step compiled threads + if (possibleNewThread.isCompiled) { + continue; + } + const status = getRealStatus(possibleNewThread); + if (status === STATUS_RUNNING || status === STATUS_YIELD || status === STATUS_YIELD_TICK) { + // Thread must not be running for single stepping to work. + pauseThread(possibleNewThread); + return possibleNewThread; + } + } + return null; +}; + +export const singleStep = () => { + if (steppingThread) { + const pauseState = pausedThreadState.get(steppingThread); + // We can assume pauseState is defined as any single stepping threads must already be paused. + + // Make it look like no time has passed + compensateForTimePassedWhilePaused(steppingThread, pauseState); + pauseState.time = vm.runtime.currentMSecs; + + // Execute the block + const continueExecuting = singleStepThread(steppingThread); + + if (!continueExecuting) { + // Try to move onto the next thread + steppingThread = findNewSteppingThread(getThreadIndex(steppingThread) + 1); + } + } + + // If we don't have a thread, than we are between VM steps and should search for a new thread + if (!steppingThread) { + setSteppingThread(findNewSteppingThread(0)); + + // End of VM step, emulate one frame of time passing. + vm.runtime.ioDevices.clock._pausedTime += vm.runtime.currentStepTime; + // Skip all sounds forward by vm.runtime.currentStepTime milliseconds so it's as + // if they where playing for one frame. + const audioContext = vm.runtime.audioEngine.audioContext; + for (const target of vm.runtime.targets) { + for (const soundId of Object.keys(target.sprite.soundBank.soundPlayers)) { + const soundPlayer = target.sprite.soundBank.soundPlayers[soundId]; + if (soundPlayer.outputNode) { + soundPlayer.outputNode.stop(audioContext.currentTime); + soundPlayer._createSource(); + soundPlayer.outputNode.start( + audioContext.currentTime, + audioContext.currentTime - soundPlayer.startingUntil + vm.runtime.currentStepTime / 1000 + ); + soundPlayer.startingUntil -= vm.runtime.currentStepTime / 1000; + } + } + } + // Move all threads forward one frame in time. For blocks like `wait () seconds` + for (const thread of vm.runtime.threads) { + if (pausedThreadState.has(thread)) { + pausedThreadState.get(thread).time += vm.runtime.currentStepTime; + } + } + + // Try to run edge activated hats + pauseNewThreads = true; + + const hats = vm.runtime._hats; + for (const hatType in hats) { + if (!Object.prototype.hasOwnProperty.call(hats, hatType)) continue; + const hat = hats[hatType]; + if (hat.edgeActivated) { + vm.runtime.startHats(hatType); + } + } + + pauseNewThreads = false; + } + + eventTarget.dispatchEvent(new CustomEvent("step")); +}; + +export const setup = (_vm) => { + if (vm) { + return; + } + + vm = _vm; + + const originalStepThreads = vm.runtime.sequencer.stepThreads; + vm.runtime.sequencer.stepThreads = function () { + if (isPaused()) { + for (const thread of this.runtime.threads) { + ensurePausedThreadIsStillPaused(thread); + } + } + return originalStepThreads.call(this); + }; + + // Unpause when green flag + const originalGreenFlag = vm.runtime.greenFlag; + vm.runtime.greenFlag = function () { + setPaused(false); + return originalGreenFlag.call(this); + }; + + // Disable edge-activated hats and hats like "when key pressed" while paused. + const originalStartHats = vm.runtime.startHats; + vm.runtime.startHats = function (...args) { + const hat = args[0]; + // These hats can be manually started by the user when paused or while single stepping. + const isUserInitiated = hat === "event_whenbroadcastreceived" || hat === "control_start_as_clone"; + if (pauseNewThreads) { + if (!isUserInitiated && !this.getIsEdgeActivatedHat(hat)) { + return []; + } + const newThreads = originalStartHats.apply(this, args); + for (const thread of newThreads) { + pauseThread(thread); + } + return newThreads; + } else if (paused && !isUserInitiated) { + return []; + } + return originalStartHats.apply(this, args); + }; + + // Paused threads should not be counted as running when updating GUI state. + const originalGetMonitorThreadCount = vm.runtime._getMonitorThreadCount; + vm.runtime._getMonitorThreadCount = function (threads) { + let count = originalGetMonitorThreadCount.call(this, threads); + if (paused) { + for (const thread of threads) { + if (pausedThreadState.has(thread)) { + count++; + } + } + } + return count; + }; +}; diff --git a/src/addons/addons/debugger/performance.js b/src/addons/addons/debugger/performance.js new file mode 100644 index 0000000000000000000000000000000000000000..40a074f8c0c8fa45f4ed9542f30fdb76b1af9d42 --- /dev/null +++ b/src/addons/addons/debugger/performance.js @@ -0,0 +1,181 @@ +import { onPauseChanged, isPaused } from "./module.js"; + +export default async function createPerformanceTab({ debug, addon, console, msg }) { + const vm = addon.tab.traps.vm; + + await addon.tab.loadScript(addon.self.getResource("/thirdparty/cs/chart.min.js")) /* rewritten by pull.js */; + + const tab = debug.createHeaderTab({ + text: msg("tab-performance"), + icon: addon.self.getResource("/icons/performance.svg") /* rewritten by pull.js */, + }); + + const content = Object.assign(document.createElement("div"), { + className: "sa-performance-tab-content", + }); + + const createChart = ({ title }) => { + const titleElement = Object.assign(document.createElement("h2"), { + textContent: title, + }); + const canvas = Object.assign(document.createElement("canvas"), { + className: "sa-debugger-chart", + }); + return { + title: titleElement, + canvas, + }; + }; + + const now = () => performance.now(); + + const getMaxFps = () => Math.round(1000 / vm.runtime.currentStepTime); + + const NUMBER_OF_POINTS = 20; + // An array like [9, 8, 7, 6, 5, 4, 3, 2, 1, 0] + const labels = Array.from(Array(NUMBER_OF_POINTS).keys()).reverse(); + + const fpsElements = createChart({ + title: msg("performance-framerate-title"), + }); + const fpsChart = new Chart(fpsElements.canvas.getContext("2d"), { + type: "line", + data: { + labels, + datasets: [ + { + data: Array(NUMBER_OF_POINTS).fill(-1), + borderWidth: 1, + fill: true, + backgroundColor: "#29beb8", + }, + ], + }, + options: { + scales: { + y: { + max: getMaxFps(), + min: 0, + }, + }, + plugins: { + legend: { + display: false, + }, + tooltip: { + callbacks: { + label: (context) => msg("performance-framerate-graph-tooltip", { fps: context.parsed.y }), + }, + }, + }, + }, + }); + + const clonesElements = createChart({ + title: msg("performance-clonecount-title"), + }); + const performanceClonesChart = new Chart(clonesElements.canvas.getContext("2d"), { + type: "line", + data: { + labels, + datasets: [ + { + data: Array(NUMBER_OF_POINTS).fill(-1), + borderWidth: 1, + fill: true, + backgroundColor: "#29beb8", + }, + ], + }, + options: { + scales: { + y: { + max: 300, + min: 0, + }, + }, + plugins: { + legend: { + display: false, + }, + tooltip: { + callbacks: { + label: (context) => msg("performance-clonecount-graph-tooltip", { clones: context.parsed.y }), + }, + }, + }, + }, + }); + + // Holds the times of each frame drawn in the last second. + // The length of this list is effectively the FPS. + const renderTimes = []; + + // The last time we pushed a new datapoint to the graph + let lastFpsTime = now() + 3000; + + debug.addAfterStepCallback(() => { + if (isPaused()) { + return; + } + const time = now(); + + // Remove all frame times older than 1 second in renderTimes + while (renderTimes.length > 0 && renderTimes[0] <= time - 1000) renderTimes.shift(); + renderTimes.push(time); + + if (time - lastFpsTime > 1000) { + lastFpsTime = time; + + const maxFps = getMaxFps(); + const fpsData = fpsChart.data.datasets[0].data; + fpsData.shift(); + fpsData.push(Math.min(renderTimes.length, maxFps)); + // Incase we switch between 30FPS and 60FPS, update the max height of the chart. + fpsChart.options.scales.y.max = maxFps; + + const clonesData = performanceClonesChart.data.datasets[0].data; + clonesData.shift(); + clonesData.push(vm.runtime._cloneCounter); + + if (isVisible) { + fpsChart.update(); + performanceClonesChart.update(); + } + } + }); + + content.appendChild(fpsElements.title); + content.appendChild(fpsElements.canvas); + content.appendChild(clonesElements.title); + content.appendChild(clonesElements.canvas); + + let pauseTime = 0; + onPauseChanged((paused) => { + if (paused) { + pauseTime = now(); + } else { + const dt = now() - pauseTime; + lastFpsTime += dt; + for (var i = 0; i < renderTimes.length; i++) { + renderTimes[i] += dt; + } + } + }); + + let isVisible = false; + const show = () => { + isVisible = true; + }; + const hide = () => { + isVisible = false; + }; + + return { + tab, + content, + buttons: [], + show, + hide, + }; +} diff --git a/src/addons/addons/debugger/style.css b/src/addons/addons/debugger/style.css new file mode 100644 index 0000000000000000000000000000000000000000..1cd396f6d07bd446510673ce6e3f932945f43d2f --- /dev/null +++ b/src/addons/addons/debugger/style.css @@ -0,0 +1,306 @@ +@import url("../editor-theme3/compatibility.css"); + +[dir="ltr"] .sa-debugger-container { + margin-right: 0.2rem; +} + +[dir="rtl"] .sa-debugger-container { + margin-left: 0.2rem; +} + +.sa-debugger-small .sa-debugger-container { + display: none !important; +} + +.sa-debugger-container [class*="button_content_"] { + position: relative; +} + +.sa-debugger-unread::after { + content: ""; + position: absolute; + top: 1px; + right: 0; + display: block; + width: 6px; + height: 6px; + background-color: var(--editorDarkMode-highlightText, #4d97ff); + border-radius: 50%; +} + +.sa-debugger-interface { + display: none; + position: absolute; + z-index: 492; + background-color: white; + width: 565px; + height: 25rem; +} +[theme="dark"] .sa-debugger-interface { + background: var(--ui-primary); +} + +.sa-debugger-interface [class*="card_header-buttons_"] { + background-color: #29beb8; + border-color: #3aa8a4; +} + +.sa-debugger-interface h1 { + padding: 10px; + z-index: 10; + width: calc(100% - 20px); + font-size: 20px; +} + +.sa-debugger-tabs { + margin: 0; + display: flex; + align-items: center; + padding: 0 15px; + font-size: 0.75rem; +} +.sa-debugger-tabs li { + margin: 0; + display: flex; + align-items: center; + padding: 0.5em 1em; + background-color: rgba(0, 0, 0, 0.1); + border: 1px solid rgba(0, 0, 0, 0.15); + border-radius: 1rem; + color: white; + cursor: pointer; +} +.sa-debugger-tabs li + li { + margin-inline-start: 10px; +} +.sa-debugger-tabs li:hover { + background-color: rgba(0, 0, 0, 0.15); +} +.sa-debugger-tabs li.sa-debugger-tab-selected { + background-color: white; + background-clip: padding-box; + border-color: rgba(0, 0, 0, 0.25); + color: #4d97ff; +} +.sa-debugger-tabs li img { + margin: 0; + margin-right: 0.25rem; + width: 1rem; + filter: brightness(0) invert(1); +} +.sa-debugger-tabs li.sa-debugger-tab-selected img { + filter: none; +} + +.sa-debugger-header-buttons img { + width: 20px; + height: 20px; +} + +.sa-debugger-unpause { + animation: saDebuggerUnpause 2s infinite alternate; +} + +@keyframes saDebuggerUnpause { + 0% { + background-color: rgba(0, 0, 0, 0.15); + } + 100% { + background-color: rgba(0, 0, 0, 0); + } +} + +.sa-debugger-tab-content { + width: 100%; + height: 100%; + overflow: auto; + cursor: auto; +} + +.sa-debugger-chart { + width: 100%; + height: 100%; +} + +.sa-performance-tab-content { + padding: 15px; +} + +.sa-debugger-log-outer { + height: 100%; +} + +.sa-debugger-log-inner { + position: relative; + overflow-y: auto; + font-size: 12px; + line-height: 1.2; + height: 100%; + contain: strict; +} + +.sa-debugger-log-empty { + display: flex; + align-items: center; + justify-content: center; + width: 100%; + height: 100%; + font-size: 20px; + font-style: italic; +} + +.sa-debugger-log-end { + position: absolute; + top: 0; + left: 0; + width: 1px; + height: 1px; +} + +.sa-debugger-log { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 20px; + box-sizing: border-box; + display: flex; + align-items: center; + border-bottom: 1px solid rgba(0, 0, 0, 0.15); + padding-left: 4px; + font-family: monospace; + color: #000; +} +[theme="dark"] .sa-debugger-log { + color: var(--text-primary); + border-color: rgba(255, 255, 255, 0.15); +} +.sa-debugger-log[data-type="warn"] { + border-color: hsl(50deg, 100%, 75%); + color: hsl(39deg 100% 18%); + background-color: hsl(50deg 100% 95%); +} +.sa-debugger-log[data-type="error"] { + border-color: hsl(0deg 100% 92%); + color: red; + background-color: hsl(0deg 100% 95%); +} +[theme="dark"] .sa-debugger-log[data-type="warn"] { + border-color: hsl(50deg, 100%, 15%); + color: hsl(39deg 100% 90%); + background-color: hsl(50deg 100% 10%); +} +[theme="dark"] .sa-debugger-log[data-type="error"] { + border-color: hsl(0deg 100% 15%); + color: hsl(0deg 100% 77%); + background-color: hsl(0deg 100% 10%); +} + +.sa-debugger-log-repeats { + background-color: hsla(163, 85%, 40%, 1); + color: white; + border-radius: 100px; + padding: 1px 6px; + margin-right: 4px; +} +[theme="dark"] .sa-debugger-log-repeats { + color: var(--ui-primary); +} + +.sa-debugger-log-icon { + width: 16px; + height: 16px; + margin-right: 4px; +} +[data-type="warn"] .sa-debugger-log-icon { + background-image: url(./icons/warning.svg); +} +[data-type="error"] .sa-debugger-log-icon { + background-image: url(./icons/error.svg); +} +.sa-debugger-threads .sa-debugger-log-icon { + background-image: url(./icons/subthread.svg); +} + +.sa-debugger-log-link { + color: inherit; + cursor: pointer; + opacity: 0.5; + text-decoration: underline; + float: right; + text-align: right; + max-width: 100%; + padding-left: 4px; + margin-right: 4px; + margin-left: auto; +} +[theme="dark"] .sa-debugger-log-link { + color: inherit; +} +.sa-debugger-log-link:hover { + text-decoration: underline; + color: #4d97ff; + opacity: 1; +} +.sa-debugger-log-link-unknown { + pointer-events: none; +} + +.sa-debugger-log-text { + overflow: hidden; + text-overflow: ellipsis; + white-space: pre; +} +.sa-debugger-log-text-empty { + font-style: italic; +} +.sa-debugger-log-internal .sa-debugger-log-text { + font-style: italic; +} + +.sa-debugger-thread-indent { + width: calc(16px * var(--level)); + margin-right: 4px; +} +.sa-debugger-thread-title .sa-debugger-thread-indent { + margin: 0; +} +.sa-debugger-thread-target-name { + font-weight: bold; + margin-right: 8px; +} +.sa-debugger-thread-running { + background-color: rgba(255, 187, 0, 0.233); + font-weight: bold; +} + +.sa-debugger-block-preview { + padding: 1px 6px; + margin-right: 4px; + background-color: var(--sa-block-colored-background); + color: var(--sa-block-text); +} +.sa-debugger-block-preview[data-shape="round"] { + border-radius: 100px; +} +.sa-debugger-block-preview[data-shape="stacked"] { + border-radius: 3px; +} + +.sa-debugger-thread-compiled { + font-style: italic; +} + +.sa-debugger-compiler-warning { + position: relative; + display: block; + text-align: center; + height: 24px; + color: #2121bf; +} +.sa-debugger-compiler-warning[hidden] { + display: none; +} +[theme="dark"] .sa-debugger-compiler-warning { + color: #bdbdf9; +} diff --git a/src/addons/addons/debugger/threads.js b/src/addons/addons/debugger/threads.js new file mode 100644 index 0000000000000000000000000000000000000000..416de1e9f8290474ffcd0ee393bd4fe49debd67b --- /dev/null +++ b/src/addons/addons/debugger/threads.js @@ -0,0 +1,252 @@ +import { onPauseChanged, isPaused, singleStep, onSingleStep, getRunningThread } from "./module.js"; +import LogView from "./log-view.js"; +import Highlighter from "../editor-stepping/highlighter.js"; + +const concatInPlace = (copyInto, copyFrom) => { + for (const i of copyFrom) { + copyInto.push(i); + } +}; + +export default async function createThreadsTab({ debug, addon, console, msg }) { + const vm = addon.tab.traps.vm; + + const tab = debug.createHeaderTab({ + text: msg("tab-threads"), + icon: addon.self.getResource("/icons/threads.svg") /* rewritten by pull.js */, + }); + + const logView = new LogView(); + logView.canAutoScrollToEnd = false; + logView.outerElement.classList.add("sa-debugger-threads"); + logView.placeholderElement.textContent = msg("no-threads-running"); + + const highlighter = new Highlighter(10, "#ff0000"); + + logView.generateRow = (row) => { + const root = document.createElement("div"); + root.className = "sa-debugger-log"; + + const isHeader = row.type === "thread-header"; + const indenter = document.createElement("div"); + indenter.className = "sa-debugger-thread-indent"; + indenter.style.setProperty("--level", isHeader ? row.depth : row.depth + 1); + root.appendChild(indenter); + + if (isHeader) { + root.classList.add("sa-debugger-thread-title"); + + if (row.depth > 0) { + const icon = document.createElement("div"); + icon.className = "sa-debugger-log-icon"; + root.appendChild(icon); + } + + const name = document.createElement("div"); + name.textContent = row.targetName; + name.className = "sa-debugger-thread-target-name"; + root.appendChild(name); + + const id = document.createElement("div"); + id.className = "sa-debugger-thread-id"; + id.textContent = msg("thread", { + id: row.id, + }); + root.appendChild(id); + } + + if (row.type === "thread-stack") { + const preview = debug.createBlockPreview(row.targetId, row.blockId); + if (preview) { + root.appendChild(preview); + } + } + + // pm: this isnt very useful if every thread will be compiled + // if (row.type === "compiled") { + // const el = document.createElement('div'); + // el.className = "sa-debugger-thread-compiled"; + // el.textContent = "Compiled threads can't be stepped and have no stack information."; + // root.appendChild(el); + // } + + if (row.targetId && row.blockId) { + root.appendChild(debug.createBlockLink(debug.getTargetInfoById(row.targetId), row.blockId)); + } + + return { + root, + }; + }; + + logView.renderRow = (elements, row) => { + const { root } = elements; + root.classList.toggle("sa-debugger-thread-running", !!row.running); + }; + + let threadInfoCache = new WeakMap(); + + const allThreadIds = new WeakMap(); + let nextThreadId = 1; + const getThreadId = (thread) => { + if (!allThreadIds.has(thread)) { + allThreadIds.set(thread, nextThreadId++); + } + return allThreadIds.get(thread); + }; + + const updateContent = () => { + if (!logView.visible) { + return; + } + + const newRows = []; + const threads = vm.runtime.threads; + const visitedThreads = new Set(); + + const createThreadInfo = (thread, depth) => { + if (visitedThreads.has(thread)) { + return []; + } + visitedThreads.add(thread); + + const id = getThreadId(thread); + const target = thread.target; + + if (!threadInfoCache.has(thread)) { + threadInfoCache.set(thread, { + headerItem: { + type: "thread-header", + depth, + targetName: target.getName(), + id, + }, + compiledItem: thread.isCompiled ? { + type: "compiled", + depth: 1, + } : null, + blockCache: new WeakMap(), + }); + } + const cacheInfo = threadInfoCache.get(thread); + + const runningThread = getRunningThread(); + const createBlockInfo = (block, stackFrameIdx) => { + const blockId = block.id; + if (!block) return; + + const stackFrame = thread.stackFrames[stackFrameIdx]; + + if (!cacheInfo.blockCache.has(block)) { + cacheInfo.blockCache.set(block, {}); + } + + const blockInfoMap = cacheInfo.blockCache.get(block); + let blockInfo = blockInfoMap[stackFrameIdx]; + + if (!blockInfo) { + blockInfo = blockInfoMap[stackFrameIdx] = { + type: "thread-stack", + depth, + targetId: target.id, + blockId, + }; + } + + blockInfo.running = + thread === runningThread && ( + thread.isCompiled || ( + blockId === runningThread.peekStack() && + stackFrameIdx === runningThread.stackFrames.length - 1 + ) + ); + + const result = [blockInfo]; + if (stackFrame && stackFrame.executionContext && stackFrame.executionContext.startedThreads) { + for (const thread of stackFrame.executionContext.startedThreads) { + concatInPlace(result, createThreadInfo(thread, depth + 1)); + } + } + + return result; + }; + + const topBlock = debug.getBlock(thread.target, thread.topBlock); + const result = [cacheInfo.headerItem]; + if (topBlock) { + concatInPlace(result, createBlockInfo(topBlock, 0)); + for (let i = 0; i < thread.stack.length; i++) { + const blockId = thread.stack[i]; + if (blockId === topBlock.id) continue; + const block = debug.getBlock(thread.target, blockId); + if (block) { + concatInPlace(result, createBlockInfo(block, i)); + } + } + } + + if (cacheInfo.compiledItem) { + result.push(cacheInfo.compiledItem); + } + + return result; + }; + + for (let i = 0; i < threads.length; i++) { + const thread = threads[i]; + // Do not display threads used to update variable and list monitors. + if (thread.updateMonitor) { + continue; + } + concatInPlace(newRows, createThreadInfo(thread, 0)); + } + + logView.rows = newRows; + logView.queueUpdateContent(); + }; + + debug.addAfterStepCallback(() => { + updateContent(); + + const runningThread = getRunningThread(); + if (runningThread) { + highlighter.setGlowingThreads([runningThread]); + } else { + highlighter.setGlowingThreads([]); + } + }); + + const stepButton = debug.createHeaderButton({ + text: msg("step"), + icon: addon.self.getResource("/icons/step.svg") /* rewritten by pull.js */, + description: msg("step-desc"), + }); + stepButton.element.addEventListener("click", () => { + singleStep(); + }); + + const handlePauseChanged = (paused) => { + stepButton.element.style.display = paused ? "" : "none"; + updateContent(); + }; + handlePauseChanged(isPaused()); + onPauseChanged(handlePauseChanged); + + onSingleStep(updateContent); + + const show = () => { + logView.show(); + updateContent(); + }; + const hide = () => { + logView.hide(); + }; + + return { + tab, + content: logView.outerElement, + buttons: [stepButton], + show, + hide, + }; +} diff --git a/src/addons/addons/debugger/userscript.js b/src/addons/addons/debugger/userscript.js new file mode 100644 index 0000000000000000000000000000000000000000..20efaf4f20d8d00bd48506baaa1add3a75fe13ab --- /dev/null +++ b/src/addons/addons/debugger/userscript.js @@ -0,0 +1,616 @@ +import { isPaused, setPaused, onPauseChanged, setup } from "./module.js"; +import createLogsTab from "./logs.js"; +import createThreadsTab from "./threads.js"; +import createPerformanceTab from "./performance.js"; +import Utils from "../find-bar/blockly/Utils.js"; + +const removeAllChildren = (element) => { + while (element.firstChild) { + element.removeChild(element.firstChild); + } +}; + +export default async function ({ addon, console, msg }) { + setup(addon.tab.traps.vm); + + let logsTab; + const messagesLoggedBeforeLogsTabLoaded = []; + const logMessage = (...args) => { + if (logsTab) { + logsTab.addLog(...args); + } else { + messagesLoggedBeforeLogsTabLoaded.push(args); + } + }; + + let hasLoggedPauseError = false; + const pause = (_, thread) => { + if (addon.tab.redux.state.scratchGui.mode.isPlayerOnly) { + if (!hasLoggedPauseError) { + logMessage(msg("cannot-pause-player"), thread, "error"); + hasLoggedPauseError = true; + } + return; + } + setPaused(true); + setInterfaceVisible(true); + }; + addon.tab.addBlock("\u200B\u200Bbreakpoint\u200B\u200B", { + args: [], + displayName: msg("block-breakpoint"), + callback: pause, + }); + addon.tab.addBlock("\u200B\u200Blog\u200B\u200B %s", { + args: ["content"], + displayName: msg("block-log"), + callback: ({ content }, thread) => { + logMessage(content, thread, "log"); + }, + }); + addon.tab.addBlock("\u200B\u200Bwarn\u200B\u200B %s", { + args: ["content"], + displayName: msg("block-warn"), + callback: ({ content }, thread) => { + logMessage(content, thread, "warn"); + }, + }); + addon.tab.addBlock("\u200B\u200Berror\u200B\u200B %s", { + args: ["content"], + displayName: msg("block-error"), + callback: ({ content }, thread) => { + logMessage(content, thread, "error"); + }, + }); + + const vm = addon.tab.traps.vm; + await new Promise((resolve, reject) => { + if (vm.editingTarget) return resolve(); + vm.runtime.once("PROJECT_LOADED", resolve); + }); + const ScratchBlocks = await addon.tab.traps.getBlockly(); + + const debuggerButtonOuter = document.createElement("div"); + debuggerButtonOuter.className = "sa-debugger-container"; + const debuggerButton = document.createElement("div"); + debuggerButton.className = addon.tab.scratchClass("button_outlined-button", "stage-header_stage-button"); + const debuggerButtonContent = document.createElement("div"); + debuggerButtonContent.className = addon.tab.scratchClass("button_content"); + const debuggerButtonImage = document.createElement("img"); + debuggerButtonImage.className = addon.tab.scratchClass("stage-header_stage-button-icon"); + debuggerButtonImage.draggable = false; + debuggerButtonImage.src = addon.self.getResource("/icons/debug.svg") /* rewritten by pull.js */; + debuggerButtonContent.appendChild(debuggerButtonImage); + debuggerButton.appendChild(debuggerButtonContent); + debuggerButtonOuter.appendChild(debuggerButton); + debuggerButton.addEventListener("click", () => setInterfaceVisible(true)); + + const setHasUnreadMessage = (unreadMessage) => { + debuggerButtonContent.classList.toggle("sa-debugger-unread", unreadMessage); + }; + + const interfaceContainer = Object.assign(document.createElement("div"), { + className: addon.tab.scratchClass("card_card", { others: "sa-debugger-interface" }), + }); + const interfaceHeader = Object.assign(document.createElement("div"), { + className: addon.tab.scratchClass("card_header-buttons"), + }); + const tabListElement = Object.assign(document.createElement("ul"), { + className: "sa-debugger-tabs", + }); + const buttonContainerElement = Object.assign(document.createElement("div"), { + className: addon.tab.scratchClass("card_header-buttons-right", { others: "sa-debugger-header-buttons" }), + }); + const tabContentContainer = Object.assign(document.createElement("div"), { + className: "sa-debugger-tab-content", + }); + + const compilerWarning = document.createElement("a"); + compilerWarning.addEventListener("click", () => { + addon.tab.redux.dispatch({ + type: "scratch-gui/modals/OPEN_MODAL", + modal: "settingsModal" + }); + }); + compilerWarning.className = "sa-debugger-log sa-debugger-compiler-warning"; + compilerWarning.textContent = "The debugger works best when the compiler is disabled."; + const updateCompilerWarningVisibility = () => { + // compilerWarning.hidden = !vm.runtime.compilerOptions.enabled; + compilerWarning.hidden = true; + }; + vm.on("COMPILER_OPTIONS_CHANGED", updateCompilerWarningVisibility); + updateCompilerWarningVisibility(); + + let isInterfaceVisible = false; + const setInterfaceVisible = (_isVisible) => { + isInterfaceVisible = _isVisible; + interfaceContainer.style.display = isInterfaceVisible ? "flex" : ""; + if (isInterfaceVisible) { + activeTab.show(); + } else { + activeTab.hide(); + } + }; + + let mouseOffsetX = 0; + let mouseOffsetY = 0; + let lastX = 0; + let lastY = 0; + const handleStartDrag = (e) => { + e.preventDefault(); + mouseOffsetX = e.clientX - interfaceContainer.offsetLeft; + mouseOffsetY = e.clientY - interfaceContainer.offsetTop; + lastX = e.clientX; + lastY = e.clientY; + document.addEventListener("mouseup", handleStopDrag); + document.addEventListener("mousemove", handleDragInterface); + }; + const handleStopDrag = () => { + document.removeEventListener("mouseup", handleStopDrag); + document.removeEventListener("mousemove", handleDragInterface); + }; + const moveInterface = (x, y) => { + lastX = x; + lastY = y; + const width = (document.documentElement.clientWidth || document.body.clientWidth) - 1; + const height = (document.documentElement.clientHeight || document.body.clientHeight) - 1; + const clampedX = Math.max(0, Math.min(x - mouseOffsetX, width - interfaceContainer.offsetWidth)); + const clampedY = Math.max(0, Math.min(y - mouseOffsetY, height - interfaceContainer.offsetHeight)); + interfaceContainer.style.left = clampedX + "px"; + interfaceContainer.style.top = clampedY + "px"; + }; + const handleDragInterface = (e) => { + e.preventDefault(); + moveInterface(e.clientX, e.clientY); + }; + window.addEventListener("resize", () => { + moveInterface(lastX, lastY); + }); + interfaceHeader.addEventListener("mousedown", handleStartDrag); + + interfaceHeader.append(tabListElement, buttonContainerElement); + interfaceContainer.append(interfaceHeader, compilerWarning, tabContentContainer); + document.body.append(interfaceContainer); + + const createHeaderButton = ({ text, icon, description }) => { + const button = Object.assign(document.createElement("div"), { + className: addon.tab.scratchClass("card_shrink-expand-button"), + draggable: false, + }); + if (description) { + button.title = description; + } + const imageElement = Object.assign(document.createElement("img"), { + src: icon, + draggable: false, + }); + const textElement = Object.assign(document.createElement("span"), { + textContent: text, + }); + button.appendChild(imageElement); + button.appendChild(textElement); + return { + element: button, + image: imageElement, + text: textElement, + }; + }; + + const createHeaderTab = ({ text, icon }) => { + const tab = document.createElement("li"); + const imageElement = Object.assign(document.createElement("img"), { + src: icon, + draggable: false, + }); + const textElement = Object.assign(document.createElement("span"), { + textContent: text, + }); + tab.appendChild(imageElement); + tab.appendChild(textElement); + return { + element: tab, + image: imageElement, + text: textElement, + }; + }; + + const unpauseButton = createHeaderButton({ + text: msg("unpause"), + icon: addon.self.getResource("/icons/play.svg") /* rewritten by pull.js */, + }); + unpauseButton.element.classList.add("sa-debugger-unpause"); + unpauseButton.element.addEventListener("click", () => setPaused(false)); + const updateUnpauseVisibility = (paused) => { + unpauseButton.element.style.display = paused ? "" : "none"; + }; + updateUnpauseVisibility(isPaused()); + onPauseChanged(updateUnpauseVisibility); + + const closeButton = createHeaderButton({ + text: msg("close"), + icon: addon.self.getResource("/icons/close.svg") /* rewritten by pull.js */, + }); + closeButton.element.addEventListener("click", () => setInterfaceVisible(false)); + + const originalStep = vm.runtime._step; + const afterStepCallbacks = []; + vm.runtime._step = function (...args) { + const ret = originalStep.call(this, ...args); + for (const cb of afterStepCallbacks) { + cb(); + } + return ret; + }; + const addAfterStepCallback = (cb) => { + afterStepCallbacks.push(cb); + }; + + const getBlock = (target, id) => target.blocks.getBlock(id) || vm.runtime.flyoutBlocks.getBlock(id); + + const getTargetInfoById = (id) => { + const target = vm.runtime.getTargetById(id); + if (target) { + let name = target.getName(); + let original = target; + if (!target.isOriginal) { + name = msg("clone-of", { + sprite: name, + }); + original = target.sprite.clones[0]; + } + return { + exists: true, + originalId: original.id, + name, + }; + } + return { + exists: false, + original: null, + name: msg("unknown-sprite"), + }; + }; + + const createBlockLink = (targetInfo, blockId) => { + const link = document.createElement("a"); + link.className = "sa-debugger-log-link"; + + const { exists, name, originalId } = targetInfo; + link.textContent = name; + if (exists) { + // We use mousedown instead of click so that you can still go to blocks when logs are rapidly scrolling + link.addEventListener("mousedown", () => { + switchToSprite(originalId); + activateCodeTab(); + goToBlock(blockId); + }); + } else { + link.classList.add("sa-debugger-log-link-unknown"); + } + + return link; + }; + + const switchToSprite = (targetId) => { + if (targetId !== vm.editingTarget.id) { + if (vm.runtime.getTargetById(targetId)) { + vm.setEditingTarget(targetId); + } + } + }; + + const activateCodeTab = () => { + const redux = addon.tab.redux; + if (redux.state.scratchGui.editorTab.activeTabIndex !== 0) { + redux.dispatch({ + type: "scratch-gui/navigation/ACTIVATE_TAB", + activeTabIndex: 0, + }); + } + }; + + const goToBlock = (blockId) => { + const workspace = Blockly.getMainWorkspace(); + const block = workspace.getBlockById(blockId); + if (!block) return; + + // Don't scroll to blocks in the flyout + if (block.workspace.isFlyout) return; + + new Utils(addon).scrollBlockIntoView(blockId); + }; + + /** + * @param {string} procedureCode + * @returns {string} + */ + const formatProcedureCode = (procedureCode) => { + const customBlock = addon.tab.getCustomBlock(procedureCode); + if (customBlock) { + procedureCode = customBlock.displayName; + } + // May be slightly incorrect in some edge cases. + return procedureCode.replace(/%[nbs]/g, "()"); + }; + + // May be slightly incorrect in some edge cases. + const formatBlocklyBlockData = (jsonData) => { + // For sample jsonData, see: + // https://github.com/LLK/scratch-blocks/blob/0bd1a17e66a779ec5d11f4a00c43784e3ac7a7b8/blocks_vertical/motion.js + // https://github.com/LLK/scratch-blocks/blob/0bd1a17e66a779ec5d11f4a00c43784e3ac7a7b8/blocks_vertical/control.js + + const processSegment = (index) => { + const message = jsonData[`message${index}`]; + const args = jsonData[`args${index}`]; + if (!message) { + return null; + } + const parts = message.split(/%\d+/g); + let formattedMessage = ""; + for (let i = 0; i < parts.length; i++) { + formattedMessage += parts[i]; + const argInfo = args && args[i]; + if (argInfo) { + const type = argInfo.type; + if (type === "field_vertical_separator") { + // no-op + } else if (type === "field_image") { + const src = argInfo.src; + if (src.endsWith("rotate-left.svg")) { + formattedMessage += "↩"; + } else if (src.endsWith("rotate-right.svg")) { + formattedMessage += "↪"; + } + } else { + formattedMessage += "()"; + } + } + } + return formattedMessage; + }; + + const parts = []; + let i = 0; + // The jsonData doesn't directly tell us how many segments it has, so we have to + // just keep looping until one doesn't exist. + while (true) { + const nextSegment = processSegment(i); + if (nextSegment) { + parts.push(nextSegment); + } else { + break; + } + i++; + } + return parts.join(" "); + }; + + const createBlockPreview = (targetId, blockId) => { + const target = vm.runtime.getTargetById(targetId); + if (!target) { + return null; + } + + const block = getBlock(target, blockId); + if (!block || block.opcode === "text") { + return null; + } + + let text; + let category; + let shape; + if ( + block.opcode === "data_variable" || + block.opcode === "data_listcontents" || + block.opcode === "argument_reporter_string_number" || + block.opcode === "argument_reporter_boolean" + ) { + text = Object.values(block.fields)[0].value; + if (block.opcode === "data_variable") { + category = "data"; + } else if (block.opcode === "data_listcontents") { + category = "list"; + } else { + category = "more"; + } + shape = "round"; + } else if (block.opcode === "procedures_call") { + const proccode = block.mutation.proccode; + text = formatProcedureCode(proccode); + const customBlock = addon.tab.getCustomBlock(proccode); + if (customBlock) { + category = "addon-custom-block"; + } else { + category = "more"; + } + } else if (block.opcode === "procedures_definition" || block.opcode === "procedures_definition_return") { + const prototypeBlockId = block.inputs.custom_block.block; + const prototypeBlock = getBlock(target, prototypeBlockId); + const proccode = prototypeBlock.mutation.proccode; + text = ScratchBlocks.ScratchMsgs.translate("PROCEDURES_DEFINITION", "define %1").replace( + "%1", + formatProcedureCode(proccode) + ); + category = "more"; + } else { + // Try to call things like https://github.com/LLK/scratch-blocks/blob/0bd1a17e66a779ec5d11f4a00c43784e3ac7a7b8/blocks_vertical/operators.js#L36 + var jsonData; + const fakeBlock = { + jsonInit(data) { + jsonData = data; + }, + }; + const blockConstructor = ScratchBlocks.Blocks[block.opcode]; + if (blockConstructor) { + try { + blockConstructor.init.call(fakeBlock); + } catch (e) { + // ignore + } + } + if (!jsonData) { + return null; + } + text = formatBlocklyBlockData(jsonData); + if (!text) { + return null; + } + // jsonData.extensions is not guaranteed to exist + category = jsonData.extensions?.includes("scratch_extension") ? "pen" : jsonData.category; + const isStatement = + (jsonData.extensions && + (jsonData.extensions.includes("shape_statement") || + jsonData.extensions.includes("shape_hat") || + jsonData.extensions.includes("shape_end"))) || + "previousStatement" in jsonData || + "nextStatement" in jsonData; + shape = isStatement ? "stacked" : "round"; + } + if (!text || !category) { + return null; + } + + const element = document.createElement("span"); + element.className = "sa-debugger-block-preview sa-block-color"; + element.textContent = text; + element.dataset.shape = shape; + + element.classList.add(`sa-block-color-${category}`); + + return element; + }; + + const api = { + debug: { + createHeaderButton, + createHeaderTab, + setHasUnreadMessage, + addAfterStepCallback, + getBlock, + getTargetInfoById, + createBlockLink, + createBlockPreview, + }, + addon, + msg, + console, + }; + logsTab = await createLogsTab(api); + const threadsTab = await createThreadsTab(api); + const allTabs = [logsTab, threadsTab]; + + for (const message of messagesLoggedBeforeLogsTabLoaded) { + logsTab.addLog(...message); + } + messagesLoggedBeforeLogsTabLoaded.length = 0; + + let activeTab; + const setActiveTab = (tab) => { + if (tab === activeTab) return; + const selectedClass = "sa-debugger-tab-selected"; + if (activeTab) { + activeTab.hide(); + activeTab.tab.element.classList.remove(selectedClass); + } + tab.tab.element.classList.add(selectedClass); + activeTab = tab; + + removeAllChildren(tabContentContainer); + tabContentContainer.appendChild(tab.content); + + removeAllChildren(buttonContainerElement); + buttonContainerElement.appendChild(unpauseButton.element); + for (const button of tab.buttons) { + buttonContainerElement.appendChild(button.element); + } + buttonContainerElement.appendChild(closeButton.element); + + if (isInterfaceVisible) { + activeTab.show(); + } + }; + for (const tab of allTabs) { + tab.tab.element.addEventListener("click", () => { + setActiveTab(tab); + }); + tabListElement.appendChild(tab.tab.element); + } + setActiveTab(allTabs[0]); + + if (addon.tab.redux.state && addon.tab.redux.state.scratchGui.stageSize.stageSize === "small") { + document.body.classList.add("sa-debugger-small"); + } + document.addEventListener( + "click", + (e) => { + if (e.target.closest("[class*='stage-header_stage-button-first']:not(.sa-hide-stage-button)")) { + document.body.classList.add("sa-debugger-small"); + } else if ( + e.target.closest("[class*='stage-header_stage-button-last']") || + e.target.closest(".sa-hide-stage-button") + ) { + document.body.classList.remove("sa-debugger-small"); + } + }, + { capture: true } + ); + + const ogGreenFlag = vm.runtime.greenFlag; + vm.runtime.greenFlag = function (...args) { + if (addon.settings.get("log_clear_greenflag")) { + logsTab.clearLogs(); + } + if (addon.settings.get("log_greenflag")) { + logsTab.addLog(msg("log-msg-flag-clicked"), null, "internal"); + } + return ogGreenFlag.call(this, ...args); + }; + + const ogMakeClone = vm.runtime.targets[0].constructor.prototype.makeClone; + vm.runtime.targets[0].constructor.prototype.makeClone = function (...args) { + if (addon.settings.get("log_failed_clone_creation") && !vm.runtime.clonesAvailable()) { + logsTab.addLog( + msg("log-msg-clone-cap", { sprite: this.getName() }), + vm.runtime.sequencer.activeThread, + "internal-warn" + ); + } + var clone = ogMakeClone.call(this, ...args); + if (addon.settings.get("log_clone_create") && clone) { + logsTab.addLog( + msg("log-msg-clone-created", { sprite: this.getName() }), + vm.runtime.sequencer.activeThread, + "internal" + ); + } + return clone; + }; + + const ogStartHats = vm.runtime.startHats; + vm.runtime.startHats = function (hat, optMatchFields, ...args) { + if (addon.settings.get("log_broadcasts") && hat === "event_whenbroadcastreceived") { + logsTab.addLog( + msg("log-msg-broadcasted", { broadcast: optMatchFields.BROADCAST_OPTION }), + vm.runtime.sequencer.activeThread, + "internal" + ); + } + return ogStartHats.call(this, hat, optMatchFields, ...args); + }; + + while (true) { + await addon.tab.waitForElement('[class*="stage-header_stage-size-row"]', { + markAsSeen: true, + reduxEvents: [ + "scratch-gui/mode/SET_PLAYER", + "scratch-gui/mode/SET_FULL_SCREEN", + "fontsLoaded/SET_FONTS_LOADED", + "scratch-gui/locales/SELECT_LOCALE", + ], + }); + if (addon.tab.editorMode === "editor") { + addon.tab.appendToSharedSpace({ space: "stageHeader", element: debuggerButtonOuter, order: 0 }); + } else { + setInterfaceVisible(false); + } + } +} diff --git a/src/addons/addons/default-costume-editor-color/_manifest_entry.js b/src/addons/addons/default-costume-editor-color/_manifest_entry.js new file mode 100644 index 0000000000000000000000000000000000000000..8c9dcfd967dffe9fcc82b83b21846e698920a184 --- /dev/null +++ b/src/addons/addons/default-costume-editor-color/_manifest_entry.js @@ -0,0 +1,53 @@ +/* generated by pull.js */ +const manifest = { + "editorOnly": true, + "noTranslations": true, + "name": "Customizable default costume editor colors", + "description": "Changes the default colors and outline size used by the costume editor.", + "credits": [ + { + "name": "GarboMuffin" + } + ], + "userscripts": [ + { + "url": "userscript.js" + } + ], + "settings": [ + { + "dynamic": true, + "name": "Default fill color", + "id": "fill", + "type": "color", + "default": "#9966FF" + }, + { + "dynamic": true, + "name": "Default outline color", + "id": "stroke", + "type": "color", + "default": "#000000" + }, + { + "dynamic": true, + "name": "Default outline size", + "id": "strokeSize", + "type": "integer", + "min": 0, + "max": 100, + "default": 4 + }, + { + "dynamic": true, + "name": "Use previous color instead of resetting after switching tools", + "id": "persistence", + "type": "boolean", + "default": true + } + ], + "tags": [], + "dynamicDisable": true, + "enabledByDefault": false +}; +export default manifest; diff --git a/src/addons/addons/default-costume-editor-color/_runtime_entry.js b/src/addons/addons/default-costume-editor-color/_runtime_entry.js new file mode 100644 index 0000000000000000000000000000000000000000..bc67131957e52185c142f348760610cfaa4f774d --- /dev/null +++ b/src/addons/addons/default-costume-editor-color/_runtime_entry.js @@ -0,0 +1,5 @@ +/* generated by pull.js */ +import _js from "./userscript.js"; +export const resources = { + "userscript.js": _js, +}; diff --git a/src/addons/addons/default-costume-editor-color/userscript.js b/src/addons/addons/default-costume-editor-color/userscript.js new file mode 100644 index 0000000000000000000000000000000000000000..ad5b272fb6234596159589454380ccc303e5d49e --- /dev/null +++ b/src/addons/addons/default-costume-editor-color/userscript.js @@ -0,0 +1,286 @@ +export default async function ({ addon, console, msg }) { + // We don"t *need* to wait for the costume editor to be opened, but redux updates take a non-zero + // amount of CPU time so let's delay that for as long as possible. + await addon.tab.traps.getPaper(); + + const hexComponent = (str) => Math.round(+str).toString(16).toUpperCase().padStart(2, "0"); + + const parseColor = (color) => { + if (color === null) { + return null; + } + if (typeof color === "string") { + // TW natively supports hex color codes with or without transparency + if (color.startsWith("#")) { + return color.substring(0, 9).toUpperCase(); + } + // Sometimes paper gives us rgb() colors which have to be converted to hex + const rgbMatch = color.match(/^rgb\((\d+)\s*,(\d+)\s*,(\d+)\)$/); + if (rgbMatch) { + const [_, r, g, b] = rgbMatch; + return `#${hexComponent(r)}${hexComponent(g)}${hexComponent(b)}`; + } + // It can also give us rgba() colors + const rgbaMatch = color.match(/^rgba\((\d+)\s*,(\d+)\s*,(\d+),([\d.]+)\)$/); + if (rgbaMatch) { + const [_, r, g, b, a] = rgbaMatch; + return `#${hexComponent(r)}${hexComponent(g)}${hexComponent(b)}${hexComponent(a * 255)}`; + } + } + console.log("Could not normalize color", color); + return null; + }; + + const parseColorStyleColor = (color) => { + if (color === MIXED) return MIXED; + return parseColor(color); + }; + + // Special value Scratch uses as color when objects with different colors are selected + // https://github.com/LLK/scratch-paint/blob/6733e20b56f52d139f9885952a57c7da012a542f/src/helper/style-path.js#L10 + const MIXED = "scratch-paint/style-path/mixed"; + + const SCRATCH_DEFAULT_FILL = parseColor("#9966FF"); + const SCRATCH_DEFAULT_STROKE = parseColor("#000000"); + + const TOOL_INFO = Object.assign(Object.create(null), { + // Tool names and gradient info defined in https://github.com/LLK/scratch-paint/blob/develop/src/lib/modes.js + // Search for activateTool() in matching file in https://github.com/LLK/scratch-paint/tree/develop/src/containers + BRUSH: { + resetsFill: true, + }, + ERASER: {}, + LINE: { + resetsStroke: true, + requiresNonZeroStrokeWidth: true, + supportsGradient: true, + }, + FILL: { + resetsFill: true, + supportsGradient: true, + }, + SELECT: { + supportsGradient: true, + }, + RESHAPE: { + supportsGradient: true, + }, + OVAL: { + resetsFill: true, + resetsStroke: true, + supportsGradient: true, + }, + RECT: { + resetsFill: true, + resetsStroke: true, + supportsGradient: true, + }, + TEXT: { + resetsFill: true, + resetsStroke: true, + }, + BIT_BRUSH: { + resetsFill: true, + }, + BIT_LINE: { + resetsFill: true, + requiresNonZeroStrokeWidth: true, + }, + BIT_OVAL: { + resetsFill: true, + resetsStroke: true, + supportsGradient: true, + }, + BIT_RECT: { + resetsFill: true, + resetsStroke: true, + supportsGradient: true, + }, + BIT_TEXT: { + resetsFill: true, + resetsStroke: true, + }, + BIT_FILL: { + resetsFill: true, + supportsGradient: true, + }, + BIT_ERASER: {}, + BIT_SELECT: { + supportsGradient: true, + }, + }); + + const getToolInfo = () => TOOL_INFO[addon.tab.redux.state.scratchPaint.mode]; + + class ColorStyleReducerWrapper { + constructor(reduxPropertyName, primaryAction, secondaryAction, gradientTypeAction) { + this.reduxPropertyName = reduxPropertyName; + this.primaryAction = primaryAction; + this.secondaryAction = secondaryAction; + this.gradientTypeAction = gradientTypeAction; + } + + get(state = addon.tab.redux.state) { + return state.scratchPaint.color[this.reduxPropertyName]; + } + + set(newColor) { + const state = this.get(); + const newPrimary = parseColorStyleColor(newColor.primary); + if (state.primary !== newPrimary) { + addon.tab.redux.dispatch({ + type: this.primaryAction, + color: newPrimary, + }); + } + const toolInfo = getToolInfo(); + const toolSupportsGradient = toolInfo && toolInfo.supportsGradient; + if (toolSupportsGradient) { + const newSecondary = parseColorStyleColor(newColor.secondary); + if (state.secondary !== newSecondary) { + addon.tab.redux.dispatch({ + type: this.secondaryAction, + color: newSecondary, + }); + } + if (state.gradientType !== newColor.gradientType) { + addon.tab.redux.dispatch({ + type: this.gradientTypeAction, + gradientType: newColor.gradientType, + }); + } + } + } + } + + const fillStyle = new ColorStyleReducerWrapper( + "fillColor", + "scratch-paint/fill-style/CHANGE_FILL_COLOR", + "scratch-paint/fill-style/CHANGE_FILL_COLOR_2", + "scratch-paint/fill-style/CHANGE_FILL_GRADIENT_TYPE" + ); + const strokeStyle = new ColorStyleReducerWrapper( + "strokeColor", + "scratch-paint/stroke-style/CHANGE_STROKE_COLOR", + "scratch-paint/stroke-style/CHANGE_STROKE_COLOR_2", + "scratch-paint/stroke-style/CHANGE_STROKE_GRADIENT_TYPE" + ); + + const simpleHexColor = (hex) => ({ + primary: hex, + secondary: null, + gradientType: "SOLID", + }); + + let defaultFillColor; + let defaultStrokeColor; + let defaultStrokeWidth; + const setDefaultColorsToSettings = () => { + defaultFillColor = simpleHexColor(parseColor(addon.settings.get("fill"))); + defaultStrokeColor = simpleHexColor(parseColor(addon.settings.get("stroke"))); + defaultStrokeWidth = addon.settings.get("strokeSize"); + }; + setDefaultColorsToSettings(); + + const applyFillColor = () => { + fillStyle.set(defaultFillColor); + }; + const applyStrokeColor = () => { + strokeStyle.set(defaultStrokeColor); + }; + const applyStrokeWidth = (mustBeNonZero) => { + let width = defaultStrokeWidth; + if (width === 0 && mustBeNonZero) { + width = 1; + } + if (addon.tab.redux.state.scratchPaint.color.strokeWidth !== width) { + addon.tab.redux.dispatch({ + type: "scratch-paint/stroke-width/CHANGE_STROKE_WIDTH", + strokeWidth: width, + }); + } + }; + + if (!addon.self.disabled) { + applyFillColor(); + applyStrokeColor(); + applyStrokeWidth(false); + } + + addon.settings.addEventListener("change", () => { + if (!addon.settings.get("persistence")) { + setDefaultColorsToSettings(); + } + }); + + const isValidColorToPersist = (color) => color.primary !== null && color.primary !== MIXED; + + let activatingTool = false; + addon.tab.redux.initialize(); + addon.tab.redux.addEventListener("statechanged", ({ detail }) => { + if (addon.self.disabled) { + return; + } + const action = detail.action; + + if (!activatingTool && addon.settings.get("persistence")) { + // We always want to check for changes instead of filtering to just certain actions because quite a few + // actions can change these. + const newFill = fillStyle.get(); + if (fillStyle.get(detail.prev) !== newFill && isValidColorToPersist(newFill)) { + defaultFillColor = newFill; + } + const newStroke = strokeStyle.get(); + if (strokeStyle.get(detail.prev) !== newStroke && isValidColorToPersist(newStroke)) { + defaultStrokeColor = newStroke; + } + + const newStrokeWidth = detail.next.scratchPaint.color.strokeWidth; + if (typeof newStrokeWidth === "number") { + defaultStrokeWidth = newStrokeWidth; + } + } + + if (action.type === "scratch-paint/modes/CHANGE_MODE") { + activatingTool = true; + queueMicrotask(() => { + activatingTool = false; + if (addon.settings.get("persistence")) { + // In persistence, we always want to re-apply the previous stroke and fill. + const toolInfo = getToolInfo(); + if (!toolInfo) { + console.warn("unknown tool", addon.tab.redux.state.scratchPaint.mode); + return; + } + if (toolInfo.resetsFill) { + applyFillColor(); + } + if (toolInfo.resetsStroke) { + applyStrokeWidth(!!toolInfo.requiresNonZeroStrokeWidth); + applyStrokeColor(); + } + } else { + // In non-persistence, we'll only apply the default colors when Scratch resets them to maintain the same behavior. + // We have to do this weird redux trick because we can't modify these constants: + // https://github.com/LLK/scratch-paint/blob/6733e20b56f52d139f9885952a57c7da012a542f/src/reducers/fill-style.js#L7 + // https://github.com/LLK/scratch-paint/blob/6733e20b56f52d139f9885952a57c7da012a542f/src/reducers/stroke-style.js#L7 + const oldFillColor = fillStyle.get(detail.prev); + if (oldFillColor.primary === null || oldFillColor.primary === MIXED) { + const newFillColor = fillStyle.get(); + if (newFillColor.primary === SCRATCH_DEFAULT_FILL) { + applyFillColor(); + } + } + const oldStrokeColor = strokeStyle.get(detail.prev); + if (oldStrokeColor.primary === null || oldStrokeColor.primary === MIXED) { + const newStrokeColor = strokeStyle.get(); + if (newStrokeColor.primary === SCRATCH_DEFAULT_STROKE) { + applyStrokeWidth(true); + applyStrokeColor(); + } + } + } + }); + } + }); +} diff --git a/src/addons/addons/disable-paste-offset/_manifest_entry.js b/src/addons/addons/disable-paste-offset/_manifest_entry.js new file mode 100644 index 0000000000000000000000000000000000000000..29313e9d7c0127c663a64213cf2ed0a11d3aa8e1 --- /dev/null +++ b/src/addons/addons/disable-paste-offset/_manifest_entry.js @@ -0,0 +1,27 @@ +/* generated by pull.js */ +const manifest = { + "editorOnly": true, + "noTranslations": true, + "name": "Do not shift pasted items", + "description": "Paste copied items at their original position instead of shifted slightly in the costume editor.", + "info": [ + { + "text": "This behavior can also be achieved without this addon by Alt+Clicking the item.", + "id": "vanilla" + } + ], + "credits": [ + { + "name": "GarboMuffin" + } + ], + "dynamicDisable": true, + "userscripts": [ + { + "url": "userscript.js" + } + ], + "tags": [], + "enabledByDefault": false +}; +export default manifest; diff --git a/src/addons/addons/disable-paste-offset/_runtime_entry.js b/src/addons/addons/disable-paste-offset/_runtime_entry.js new file mode 100644 index 0000000000000000000000000000000000000000..bc67131957e52185c142f348760610cfaa4f774d --- /dev/null +++ b/src/addons/addons/disable-paste-offset/_runtime_entry.js @@ -0,0 +1,5 @@ +/* generated by pull.js */ +import _js from "./userscript.js"; +export const resources = { + "userscript.js": _js, +}; diff --git a/src/addons/addons/disable-paste-offset/userscript.js b/src/addons/addons/disable-paste-offset/userscript.js new file mode 100644 index 0000000000000000000000000000000000000000..add5225a9cf157305e6c026fbbd72cec432bea30 --- /dev/null +++ b/src/addons/addons/disable-paste-offset/userscript.js @@ -0,0 +1,22 @@ +export default async function ({ addon, console }) { + addon.tab.redux.initialize(); + addon.tab.redux.addEventListener("statechanged", ({ detail }) => { + if (addon.self.disabled) return; + if ( + detail.action.type === "scratch-paint/clipboard/SET" || + detail.action.type === "scratch-paint/clipboard/INCREMENT_PASTE_OFFSET" + ) { + addon.tab.redux.dispatch({ type: "scratch-paint/clipboard/CLEAR_PASTE_OFFSET" }); + } + }); + addon.self.addEventListener("disabled", () => { + addon.tab.redux.dispatch({ type: "scratch-paint/clipboard/CLEAR_PASTE_OFFSET" }); + addon.tab.redux.dispatch({ type: "scratch-paint/clipboard/INCREMENT_PASTE_OFFSET" }); + }); + addon.self.addEventListener("reenabled", () => { + addon.tab.redux.dispatch({ type: "scratch-paint/clipboard/CLEAR_PASTE_OFFSET" }); + }); + if (addon.self.enabledLate) { + addon.tab.redux.dispatch({ type: "scratch-paint/clipboard/CLEAR_PASTE_OFFSET" }); + } +} diff --git a/src/addons/addons/disable-stage-drag-select/_manifest_entry.js b/src/addons/addons/disable-stage-drag-select/_manifest_entry.js new file mode 100644 index 0000000000000000000000000000000000000000..47868d5c652216deb6717edf31ff318bf87020d3 --- /dev/null +++ b/src/addons/addons/disable-stage-drag-select/_manifest_entry.js @@ -0,0 +1,25 @@ +/* generated by pull.js */ +const manifest = { + "editorOnly": true, + "noTranslations": true, + "name": "Non-draggable sprites in editor", + "description": "Removes the ability to drag sprites around on the stage in the editor, except those explicitly set as draggable. Hold Shift while dragging a sprite to move it normally.", + "credits": [ + { + "name": "Chrome_Cat", + "link": "https://scratch.mit.edu/users/Chrome_Cat/" + }, + { + "name": "GarboMuffin" + } + ], + "userscripts": [ + { + "url": "userscript.js" + } + ], + "tags": [], + "enabledByDefault": false, + "dynamicDisable": true +}; +export default manifest; diff --git a/src/addons/addons/disable-stage-drag-select/_runtime_entry.js b/src/addons/addons/disable-stage-drag-select/_runtime_entry.js new file mode 100644 index 0000000000000000000000000000000000000000..bc67131957e52185c142f348760610cfaa4f774d --- /dev/null +++ b/src/addons/addons/disable-stage-drag-select/_runtime_entry.js @@ -0,0 +1,5 @@ +/* generated by pull.js */ +import _js from "./userscript.js"; +export const resources = { + "userscript.js": _js, +}; diff --git a/src/addons/addons/disable-stage-drag-select/userscript.js b/src/addons/addons/disable-stage-drag-select/userscript.js new file mode 100644 index 0000000000000000000000000000000000000000..d679a26a142d18539fe7572f4605135dee897063 --- /dev/null +++ b/src/addons/addons/disable-stage-drag-select/userscript.js @@ -0,0 +1,39 @@ +export default async ({ addon, console }) => { + const vm = addon.tab.traps.vm; + + let shiftKeyPressed = false; + document.addEventListener( + "mousedown", + function (e) { + shiftKeyPressed = e.shiftKey; + }, + { + capture: true, + } + ); + + // Do not focus sprite after dragging it + const oldStopDrag = vm.stopDrag; + vm.stopDrag = function (...args) { + if (shiftKeyPressed || addon.self.disabled) return oldStopDrag.call(this, ...args); + const setEditingTarget = this.setEditingTarget; + this.setEditingTarget = () => {}; + const r = oldStopDrag.call(this, ...args); + this.setEditingTarget = setEditingTarget; + return r; + }; + + // Don't let the editor drag sprites that aren't marked as draggable + const oldGetTargetIdForDrawableId = vm.getTargetIdForDrawableId; + vm.getTargetIdForDrawableId = function (...args) { + const targetId = oldGetTargetIdForDrawableId.call(this, ...args); + if (shiftKeyPressed || addon.self.disabled) return targetId; + if (targetId !== null) { + const target = this.runtime.getTargetById(targetId); + if (target && !target.draggable) { + return null; + } + } + return targetId; + }; +}; diff --git a/src/addons/addons/drag-drop/_manifest_entry.js b/src/addons/addons/drag-drop/_manifest_entry.js new file mode 100644 index 0000000000000000000000000000000000000000..db515339a1b54beca4f0c38068868c0227c0da01 --- /dev/null +++ b/src/addons/addons/drag-drop/_manifest_entry.js @@ -0,0 +1,34 @@ +/* generated by pull.js */ +const manifest = { + "noTranslations": true, + "name": "File drag and drop", + "description": "Lets you drag images and sounds from your file manager into the sprite pane or costume/sound list. You can also drag text files into lists or \"ask and wait\" question inputs.", + "credits": [ + { + "name": "Sheep_maker" + } + ], + "userscripts": [ + { + "url": "userscript.js" + } + ], + "settings": [ + { + "dynamic": true, + "id": "use-hd-upload", + "name": "Use HD uploads", + "type": "boolean", + "default": false, + "if": { + "addonEnabled": "better-img-uploads" + } + } + ], + "dynamicDisable": true, + "tags": [ + "recommended" + ], + "enabledByDefault": true +}; +export default manifest; diff --git a/src/addons/addons/drag-drop/_runtime_entry.js b/src/addons/addons/drag-drop/_runtime_entry.js new file mode 100644 index 0000000000000000000000000000000000000000..bc67131957e52185c142f348760610cfaa4f774d --- /dev/null +++ b/src/addons/addons/drag-drop/_runtime_entry.js @@ -0,0 +1,5 @@ +/* generated by pull.js */ +import _js from "./userscript.js"; +export const resources = { + "userscript.js": _js, +}; diff --git a/src/addons/addons/drag-drop/userscript.js b/src/addons/addons/drag-drop/userscript.js new file mode 100644 index 0000000000000000000000000000000000000000..7f2ec09535724ccee64b33cc06d8b608ee3c3c18 --- /dev/null +++ b/src/addons/addons/drag-drop/userscript.js @@ -0,0 +1,187 @@ +export default async function ({ addon, console }) { + /** @type {HTMLElement|null} */ + let currentDraggingElement = null; + + /** @type {WeakMap} */ + const allAnimations = new WeakMap(); + + const FORWARD = 1; + const REVERSE = -1; + + /** + * @param {HTMLElement} element + * @param {number} direction + * @returns {Animation} + */ + const animateElement = (element, direction) => { + /** @type {Animation} */ + let animation; + if (allAnimations.has(element)) { + animation = allAnimations.get(element); + } else { + animation = element.animate( + [ + { + // this object intentionally empty so the element animates from whatever its default value + // is in CSS. + }, + { + backgroundColor: "#60E1FF", + }, + ], + { + duration: 250, + fill: "forwards", + easing: "ease", + } + ); + allAnimations.set(element, animation); + } + + animation.playbackRate = direction; + }; + + const nativeInputValueSetter = Object.getOwnPropertyDescriptor(window.HTMLInputElement.prototype, "value").set; + const reactAwareSetValue = (el, value) => { + nativeInputValueSetter.call(el, value); + el.dispatchEvent(new Event("change", { bubbles: true })); + }; + + const globalHandleDragOver = (e) => { + if (addon.self.disabled) return; + + if (!e.dataTransfer.types.includes("Files")) { + return; + } + + let el; + let callback; + if ( + (el = e.target.closest('div[class*="sprite-selector_sprite-selector"]')) || + (el = e.target.closest('div[class*="stage-selector_stage-selector"]')) || + (el = e.target.closest('div[class*="selector_wrapper"]')) + ) { + callback = (files) => { + const hdFilter = addon.settings.get("use-hd-upload") ? "" : ":not(.sa-better-img-uploads-input)"; + const fileInput = el.querySelector('input[class*="action-menu_file-input"]' + hdFilter); + fileInput.files = files; + fileInput.dispatchEvent(new Event("change", { bubbles: true })); + }; + } else if ((el = e.target.closest('div[class*="monitor_list-monitor"]'))) { + callback = (files) => { + const contextMenuBefore = document.querySelector("body > .react-contextmenu.react-contextmenu--visible"); + // Simulate a right click on the list monitor + el.dispatchEvent(new MouseEvent("contextmenu", { bubbles: true })); + // Get the right click menu that opened (monitor context menus are + // children of ) + const contextMenuAfter = document.querySelector("body > .react-contextmenu.react-contextmenu--visible"); + // `contextMenuAfter` is only null if the context menu was already open + // for the list monitor, in which case we can use the context menu from + // before the simulated right click + const contextMenu = contextMenuAfter === null ? contextMenuBefore : contextMenuAfter; + // Sometimes the menu flashes open, so force hide it. + contextMenu.style.display = "none"; + // Override DOM methods to import the text file directly + // See: https://github.com/LLK/scratch-gui/blob/develop/src/lib/import-csv.js#L21-L22 + const appendChild = document.body.appendChild; + document.body.appendChild = (fileInput) => { + // Restore appendChild to + document.body.appendChild = appendChild; + if (fileInput instanceof HTMLInputElement) { + document.body.appendChild(fileInput); + // Prevent Scratch from opening the file input dialog + fileInput.click = () => {}; + // Insert files from the drop event into the file input + fileInput.files = files; + fileInput.dispatchEvent(new Event("change")); + window.requestAnimationFrame(() => { + window.requestAnimationFrame(() => { + contextMenu.style.display = null; + contextMenu.style.opacity = 0; + contextMenu.style.pointerEvents = "none"; + }); + }); + } else { + // The next call for `appendChild` SHOULD be the file input, but if + // it's not, then make `appendChild` behave as normal. + console.error('File input was not immediately given to appendChild upon clicking "Import"!'); + return appendChild(fileInput); + } + }; + // Simulate clicking on the "Import" option + contextMenu.children[0].click(); + }; + } else if ( + (el = e.target.closest('div[class*="question_question-input"] > input[class*="input_input-form_l9eYg"]')) + ) { + callback = async (files) => { + const text = (await Promise.all(Array.from(files, (file) => file.text()))) + .join("") + // Match pasting behavior: remove all newline characters at the end + .replace(/[\r\n]+$/, "") + .replace(/\r?\n|\r/g, " "); + const selectionStart = el.selectionStart; + reactAwareSetValue(el, el.value.slice(0, selectionStart) + text + el.value.slice(el.selectionEnd)); + el.setSelectionRange(selectionStart, selectionStart + text.length); + }; + } + if (!el) { + return; + } + + e.preventDefault(); + + if (el === currentDraggingElement) { + return; + } + currentDraggingElement = el; + + /** @type {HTMLElement[]} */ + const elementsToAnimate = [ + el, + el.querySelector('div[class*="stage-selector_header_"]'), + el.querySelector('div[class*="sprite-info_sprite-info"]'), + el.querySelector('div[class*="monitor_list-body"]'), + ].filter((i) => i); + for (const el of elementsToAnimate) { + animateElement(el, FORWARD); + } + + const handleDrop = (e) => { + e.preventDefault(); + cleanup(); + if (e.dataTransfer.types.includes("Files") && e.dataTransfer.files.length > 0) { + callback(e.dataTransfer.files); + } + }; + + const handleDragOver = (e) => { + e.preventDefault(); + e.dataTransfer.dropEffect = "copy"; + }; + e.dataTransfer.dropEffect = "copy"; + + const handleDragLeave = (e) => { + e.preventDefault(); + cleanup(); + }; + + const cleanup = () => { + currentDraggingElement = null; + + el.removeEventListener("dragover", handleDragOver); + el.removeEventListener("dragleave", handleDragLeave); + el.removeEventListener("drop", handleDrop); + + for (const el of elementsToAnimate) { + animateElement(el, REVERSE); + } + }; + + el.addEventListener("dragover", handleDragOver); + el.addEventListener("dragleave", handleDragLeave); + el.addEventListener("drop", handleDrop); + }; + + document.addEventListener("dragover", globalHandleDragOver, { useCapture: true }); +} diff --git a/src/addons/addons/editor-animations/_manifest_entry.js b/src/addons/addons/editor-animations/_manifest_entry.js new file mode 100644 index 0000000000000000000000000000000000000000..a0d6f18cbf699d22fcd837b1ab54c774b0d969ac --- /dev/null +++ b/src/addons/addons/editor-animations/_manifest_entry.js @@ -0,0 +1,103 @@ +/* generated by pull.js */ +const manifest = { + "editorOnly": true, + "noTranslations": true, + "name": "Editor Animations", + "description": "Adds smooth animations to various aspects of the editor!", + "credits": [ + { + "name": "reflow" + }, + { + "name": "SharkPool" + } + ], + "info": [ + { + "type": "notice", + "text": "This addon will not take effect if you have animations turned off on your system. See https://mgik.dev/turn-on-motion for how to turn it on.", + "id": "reduced-motion-notice" + }, + { + "type": "notice", + "text": "Some animation types don't support animation direction; therefore, the animation direction may be ignored.", + "id": "animation-support" + } + ], + "settings": [ + { + "id": "animateButtons", + "name": "Animate Buttons", + "default": true, + "dynamic": true, + "type": "boolean" + }, + { + "id": "animateLibraries", + "name": "Animate Libraries (costumes, sprites, sounds, etc)", + "default": true, + "dynamic": true, + "type": "boolean" + }, + { + "id": "animateModals", + "name": "Animate Modals (create variable/list, custom block, etc)", + "default": true, + "dynamic": true, + "type": "boolean" + }, + { + "id": "animateSpeed", + "name": "Animation Speed (1-500%)", + "type": "integer", + "dynamic": true, + "min": 1, + "default": 100, + "max": 500 + }, + { + "id": "animationType", + "name": "Animation Type", + "type": "select", + "dynamic": true, + "default": "default", + "potentialValues": [ + { "id": "default", "name": "Default" }, + { "id": "ease", "name": "Ease" }, + { "id": "smoothStep", "name": "Smooth Step" }, + { "id": "fastInSlowOut", "name": "Fast In Slow Out" }, + { "id": "sine", "name": "Sine" }, + { "id": "quad", "name": "Quadratic" }, + { "id": "cubic", "name": "Cubic" }, + { "id": "quart", "name": "Quartic" }, + { "id": "quint", "name": "Quintic" }, + { "id": "back", "name": "Back" }, + { "id": "elastic", "name": "Elastic" }, + { "id": "bounce", "name": "Bounce" }, + { "id": "emphasis", "name": "Emphasis" }, + ] + }, + { + "id": "animationDir", + "name": "Animation Direction", + "type": "select", + "dynamic": true, + "default": "InOut", + "potentialValues": [ + { "id": "In", "name": "In" }, + { "id": "Out", "name": "Out" }, + { "id": "InOut", "name": "Both" }, + ] + }, + ], + "userscripts": [ + { + "url": "userscript.js" + } + ], + "tags": [ + "new", "theme" + ], + "enabledByDefault": true +}; +export default manifest; \ No newline at end of file diff --git a/src/addons/addons/editor-animations/_runtime_entry.js b/src/addons/addons/editor-animations/_runtime_entry.js new file mode 100644 index 0000000000000000000000000000000000000000..a8355d872a80e6843ddfcd66b3e412915e932d21 --- /dev/null +++ b/src/addons/addons/editor-animations/_runtime_entry.js @@ -0,0 +1,5 @@ +/* generated by pull.js */ +import _js from "./userscript.js"; +export const resources = { + "userscript.js": _js, +}; \ No newline at end of file diff --git a/src/addons/addons/editor-animations/userscript.js b/src/addons/addons/editor-animations/userscript.js new file mode 100644 index 0000000000000000000000000000000000000000..0cc0206687fa99cc178ba233a86e8c6c502e3749 --- /dev/null +++ b/src/addons/addons/editor-animations/userscript.js @@ -0,0 +1,509 @@ +// Editor Animations (remake of Reactive Animation by ) +// By: SharkPool +// By: reflow + +/* TODO +- patch custom modal api when added +- patch adding modals from addons (they dont use react) +*/ + +export default async function({ addon }) { + const mediaQuery = window.matchMedia("(prefers-reduced-motion: reduce)"); + const addonKey = "addonAnimations-"; + const animationTypes = { + "default": "cubic-bezier(0.63, 0.32, 0.08, 0.95)", + "easeIn": "cubic-bezier(0.42, 0, 1.0, 1.0)", + "easeOut": "cubic-bezier(0, 0, 0.58, 1.0)", + "easeInOut": "cubic-bezier(0.42, 0, 0.58, 1.0)", + "smoothStep": "cubic-bezier(0.25, 0.1, 0.25, 1.0)", + "fastInSlowOut": "cubic-bezier(0.4, 0.0, 0.2, 1.0)", + "sineIn": "cubic-bezier(0.47, 0, 0.745, 0.715)", + "sineOut": "cubic-bezier(0.39, 0.575, 0.565, 1)", + "sineInOut": "cubic-bezier(0.445, 0.05, 0.55, 0.95)", + "quadIn": "cubic-bezier(0.55, 0.085, 0.68, 0.53)", + "quadOut": "cubic-bezier(0.25, 0.46, 0.45, 0.94)", + "quadInOut": "cubic-bezier(0.455, 0.03, 0.515, 0.955)", + "cubicIn": "cubic-bezier(0.55, 0.055, 0.675, 0.19)", + "cubicOut": "cubic-bezier(0.215, 0.61, 0.355, 1)", + "cubicInOut": "cubic-bezier(0.645, 0.045, 0.355, 1)", + "quartIn": "cubic-bezier(0.895, 0.03, 0.685, 0.22)", + "quartOut": "cubic-bezier(0.165, 0.84, 0.44, 1)", + "quartInOut": "cubic-bezier(0.77, 0, 0.175, 1)", + "quintIn": "cubic-bezier(0.755, 0.05, 0.855, 0.06)", + "quintOut": "cubic-bezier(0.23, 1, 0.32, 1)", + "quintInOut": "cubic-bezier(0.86, 0, 0.07, 1)", + "backIn": "cubic-bezier(0.6, -0.28, 0.74, 0.05)", + "backOut": "cubic-bezier(0.18, 0.89, 0.32, 1.28)", + "backInOut": "cubic-bezier(0.68, -0.55, 0.27, 1.55)", + "elastic": "linear(0 0%, 0.22 2.1%, 0.86 6.5%, 1.11 8.6%, 1.3 10.7%, 1.35 11.8%, 1.37 12.9%, 1.37 13.7%, 1.36 14.5%, 1.32 16.2%, 1.03 21.8%, 0.94 24%, 0.89 25.9%, 0.88 26.85%, 0.87 27.8%, 0.87 29.25%, 0.88 30.7%, 0.91 32.4%, 0.98 36.4%, 1.01 38.3%, 1.04 40.5%, 1.05 42.7%, 1.05 44.1%, 1.04 45.7%, 1 53.3%, 0.99 55.4%, 0.98 57.5%, 0.99 60.7%, 1 68.1%, 1.01 72.2%, 1 86.7%, 1 100%)", + "bounce": "linear(0 0%, 0 2.27%, 0.02 4.53%, 0.04 6.8%, 0.06 9.07%, 0.1 11.33%, 0.14 13.6%, 0.25 18.15%, 0.39 22.7%, 0.56 27.25%, 0.77 31.8%, 1 36.35%, 0.89 40.9%, 0.85 43.18%, 0.81 45.45%, 0.79 47.72%, 0.77 50%, 0.75 52.27%, 0.75 54.55%, 0.75 56.82%, 0.77 59.1%, 0.79 61.38%, 0.81 63.65%, 0.85 65.93%, 0.89 68.2%, 1 72.7%, 0.97 74.98%, 0.95 77.25%, 0.94 79.53%, 0.94 81.8%, 0.94 84.08%, 0.95 86.35%, 0.97 88.63%, 1 90.9%, 0.99 93.18%, 0.98 95.45%, 0.99 97.73%, 1 100%)", + "emphasis": "linear(0 0%, 0 1.8%, 0.01 3.6%, 0.03 6.35%, 0.07 9.1%, 0.13 11.4%, 0.19 13.4%, 0.27 15%, 0.34 16.1%, 0.54 18.35%, 0.66 20.6%, 0.72 22.4%, 0.77 24.6%, 0.81 27.3%, 0.85 30.4%, 0.88 35.1%, 0.92 40.6%, 0.94 47.2%, 0.96 55%, 0.98 64%, 0.99 74.4%, 1 86.4%, 1 100%)", + }; + const hasNoVariation = ["default", "fastInSlowOut", "smoothStep", "elastic", "bounce", "emphasis"]; + + + let needsInit = true, animateModals = true, animateLibraries = true, animateButtons = true, + animationSpeed = 1, animationType = "default", animationDir = "InOut"; + let patchedBody = false, sbPatched = false, sbEverPatched = false, listenerAttached = false; + + const genStyles = () => ` +/* Top Bar Items */ +.${addonKey}top-bar-scaler { + transition: transform ${getAnim(.1)}; + transform-origin: center center; + transform-box: fill-box; +} +.${addonKey}top-bar-scaler:hover:not([addon-scale-stop="true"]) { + transform: scale(1.05); +} +.${addonKey}top-bar-scaler:active:not([addon-scale-stop="true"]) { + transform: scale(.95); +} + +/* + Assets, Blockly Button Texts + Costume/Extension/Sprite/Sound Library UI +*/ +.${addonKey}static-scaler { + transition: transform ${getAnim(.1)}; + transform-origin: center center; + transform-box: fill-box; +} +.${addonKey}static-scaler:hover:not([addon-scale-stop="true"]) { + transform: scale(1.05); +} +.${addonKey}static-scaler:active:not([addon-scale-stop="true"]) { + transform: scale(.95); +} + +/* + Sound & Costume Editor Buttons, + Project Controls, Blockly Zoom +*/ +.${addonKey}static-scaler-big { + transition: transform ${getAnim(.2)} !important; + transform-origin: center center; + transform-box: fill-box; +} +.${addonKey}static-scaler-big:hover { + transform: scale(1.1); +} +.${addonKey}static-scaler-big:active { + transform: scale(.9); +} + +/* Custom Extension Button (Library) */ +.${addonKey}custom-ext-hover { + transition: transform ${getAnim(.2)}, border ${getAnim(.5)}; + justify-content: center; + border: none; +} +.${addonKey}custom-ext-hover:hover { + border: solid 3px #00000050; +} +.${addonKey}custom-ext-hover:active { + transform: scale(.95); + border: none; +} + +/* Library Items */ +.${addonKey}library-item-scaler div[class^="library-item_library-item"] { + transition: transform ${getAnim(.1)}; + transform-origin: center center; + transform-box: fill-box; +} +.${addonKey}library-item-scaler div[class^="library-item_library-item"]:hover { + transform: scale(1.05); +} +.${addonKey}library-item-scaler div[class^="library-item_library-item"]:active { + transform: scale(.95); +} + +/* Categories */ +.${addonKey}category-scaler div div[class="scratchCategoryMenuRow"] { + transition: transform ${getAnim(.1)}; + transform-origin: center center; + transform-box: fill-box; +} +.${addonKey}category-scaler div div[class="scratchCategoryMenuRow"]:hover { + transform: scale(1.05); +} +.${addonKey}category-scaler div div[class="scratchCategoryMenuRow"]:active { + transform: scale(.95); +} +`; + + const styleElement = document.createElement("style"); + styleElement.classList.add("addon-editorAnimations"); + styleElement.textContent = genStyles(); + document.head.appendChild(styleElement); + + let animationEnabled = !mediaQuery.matches; + mediaQuery.addEventListener("change", (e) => { + animationEnabled = !e.matches; + }); + + function requestAddonState() { + animateModals = addon.settings.get("animateModals"); + animateLibraries = addon.settings.get("animateLibraries"); + animateButtons = addon.settings.get("animateButtons"); + animationType = addon.settings.get("animationType"); + animationDir = addon.settings.get("animationDir"); + const oldSpeed = animationSpeed; + animationSpeed = 1 / (Number(addon.settings.get("animateSpeed")) / 100); + if (oldSpeed !== animationSpeed) styleElement.textContent = genStyles(); + } + + function getEasing() { + if (hasNoVariation.includes(animationType)) { + return animationTypes[animationType]; + } else { + return animationTypes[animationType + animationDir]; + } + } + + function getAnim(time) { + time *= animationSpeed; + return `${time}s ${getEasing()}`; + }; + + function observeMenuScalers(element, observerSub, observerAtt) { + if (!animateModals) return; + if (element.hasAttribute("addon-scale-listeners-bound")) return; + + const onMouseOver = () => element.setAttribute("addon-scale-stop", true); + const onMouseOut = () => element.setAttribute("addon-scale-stop", false); + + element.addEventListener("mouseover", onMouseOver); + element.addEventListener("mouseout", onMouseOut); + element.setAttribute("addon-scale-listeners-bound", "true"); + element.setAttribute("addon-scale-stop", true); + + const observer = new MutationObserver(() => { + if ( + !element.classList.contains("menu-bar_active") && + element.querySelector("nav")?.style?.opacity !== "1" + ) { + element.removeEventListener("mouseover", onMouseOver); + element.removeEventListener("mouseout", onMouseOut); + element.removeAttribute("addon-scale-listeners-bound"); + element.setAttribute("addon-scale-stop", false); + observer.disconnect(); + } + }); + observer.observe( + element, + { subtree: observerSub, attributes: true, attributeFilter: observerAtt } + ); + } + + function handleOpenAnimation(elementName) { + const type = elementName.endsWith("Library") ? "library" : elementName.endsWith("Menu") ? "menu" : "modal"; + + if (!animateLibraries && type === "library") return; + if (!animateModals && type !== "library") return; + + let element; + let animTime = 200; + if (type === "menu") { + if (elementName === "ctxMenu") element = document.querySelector(`div[class*="blocklyContextMenu"]`); + else if (elementName === "guiCtxMenu") element = document.querySelector(`nav[class*="context-menu_context-menu"][class*="react-contextmenu--visible"]`); + else { + element = Array.from(document.querySelectorAll(`div[class*="menu-bar_menu-bar-menu_"] ul[class*="menu_menu_"]`)); + if (!element.length) return; + element = element.find((e) => !e.hasAttribute("style")); + } + if (!element) return; + + if (type === "menu") { + const menuItem = element.parentNode.parentNode; + setTimeout(() => observeMenuScalers(menuItem, false, ["class"]), 10); + } + + const ogHeight = element.getBoundingClientRect().height; + element.style.overflow = "hidden"; + element.style.transition = `transform ${getAnim(.2)}`; + element.style.transformOrigin = "left top"; + if (elementName === "guiCtxMenu") animTime = 500; + else element.style.transform = "translateY(-2px) scale(.999)"; + + const animation = element.animate( + [{ height: "0px", opacity: 0 }, { height: `${ogHeight}px`, opacity: 1 }], + { duration: animTime * animationSpeed, easing: getEasing() } + ); + animation.onfinish = () => { + element.style.overflow = ""; + }; + return; + } + + element = document.querySelector(`div[class="ReactModalPortal"] div[class*="ReactModal__Overlay"]`)?.firstChild; + if (!element) return; + if (type === "library") { + animTime = 500; + if (elementName === "extensionLibrary" || elementName === "costumeLibrary") element.style.transformOrigin = "left bottom"; + else element.style.transformOrigin = "center bottom"; + } + + element.animate( + [{ transform: "scale(0)", opacity: 0 }, { transform: "scale(1)", opacity: 1 }], + { duration: animTime * animationSpeed, easing: getEasing() } + ); + } + + function attachCloseHijack(elementName) { + const type = elementName.endsWith("Library") ? "library" : elementName.endsWith("Menu") ? "menu" : "modal"; + if (type === "menu" || patchedBody) return; + + if (!animateLibraries && type === "library") return; + if (!animateModals && type !== "library") return; + + // Monkey Patch + const ogRemoveChild = document.body.constructor.prototype.removeChild; + document.body.constructor.prototype.removeChild = function(child) { + const element = document.querySelector(`div[class="ReactModalPortal"]`); + if (!element) return ogRemoveChild.call(this, child); + + let animTime = 200; + patchedBody = true; + if (child === element) { + const child = element.firstChild; + if (child) { + const animClone = child.cloneNode(true); + animClone.style.position = "fixed"; + animClone.style.top = child.getBoundingClientRect().top + "px"; + animClone.style.left = child.getBoundingClientRect().left + "px"; + animClone.style.zIndex = "99999"; + animClone.style.pointerEvents = "none"; + if (type === "library") { + animTime = 500; + if (elementName === "extensionLibrary" || elementName === "costumeLibrary") animClone.style.transformOrigin = "left bottom"; + else animClone.style.transformOrigin = "center bottom"; + } + document.body.appendChild(animClone); + + animClone.animate( + [{ opacity: 1 }, { opacity: 0 }], + { duration: animTime * animationSpeed, easing: getEasing() } + ); + const animation = animClone.firstChild.animate( + [{ transform: "scale(1)", opacity: 1 }, { transform: "scale(0)", opacity: 0 }], + { duration: animTime * animationSpeed, easing: getEasing() } + ); + animation.onfinish = () => { + animClone.remove(); + ogRemoveChild.call(element.parentNode, element); + }; + document.body.constructor.prototype.removeChild = ogRemoveChild; + patchedBody = false; + return child; + } + } + return ogRemoveChild.call(this, child); + }; + } + + function compileClasses(optLibrary) { + if (!animateButtons) return; + const classMapper = new Map(); + + if (optLibrary) { + const collapser = document.querySelector(`button[class^="library_library-filter-collapse"]`); + const filterDiv = document.querySelector(`div[class^="library_library-filter-bar"]`); + collapser.style.transform = "rotateY(180deg)"; + collapser.addEventListener("click", (e) => { + e.preventDefault(); + const isClosed = collapser.hasAttribute("closed"); + if (isClosed) { + collapser.style.transform = "rotateY(180deg)"; + collapser.removeAttribute("closed"); + filterDiv.style.display = ""; + filterDiv.animate( + [{ width: "0px", opacity: 0 }, { width: "342px", opacity: 1 }], + { duration: 300, easing: getEasing() } + ); + } else { + collapser.style.transform = "rotateY(0deg)"; + const animation = filterDiv.animate( + [{ width: "342px", opacity: 1 }, { width: "0px", opacity: 0 }], + { duration: 300, easing: getEasing() } + ); + animation.onfinish = () => { + collapser.setAttribute("closed", "true"); + filterDiv.style.display = "none"; + }; + } + + e.stopPropagation(); + }); + + if (optLibrary === "extensionLibrary") { + classMapper.set("custom-ext-hover", [document.querySelector(`span[class*="button_outlined-button"][class*="tag-button_tag-button"]`)]); + } + classMapper.set("library-item-scaler", [document.querySelector(`div[class*="library_library-scroll-grid"]`)]); + classMapper.set("static-scaler", [ + document.querySelector(`span[class*="modal_back-button_"]`), + collapser + ]); + } else { + classMapper.set("top-bar-scaler", document.querySelectorAll(`div[class*="menu-bar_main-menu"] div[class*="menu-bar_menu-bar-item"][class*="hoverable"]`)); + classMapper.set("category-scaler", [document.querySelector(`div[class="blocklyToolboxDiv"]`)]); + classMapper.set("static-scaler", [ + /* Blockly Button Texts */ + ...document.querySelectorAll(`g[class="blocklyFlyoutButton"] text[class="blocklyText"]`), + /* Costume & Sound Assets */ + ...document.querySelectorAll(`div[class*="selector_list-item"][class*="sprite-selector-item"]`), + /* Sprite Selector */ + ...document.querySelectorAll(`div[class*="sprite-selector_sprite"][class*="sprite-selector-item"]`), + /* Backpack Selector */ + ...document.querySelectorAll(`div[class*="backpack_backpack-item"][class*="sprite-selector-item"]`), + ]); + classMapper.set("static-scaler-big", [ + /* Sound & Costume Editor Buttons */ + ...document.querySelectorAll(`div[class*="sound-editor_effect-button"]`), + ...document.querySelectorAll(`div[class*="sound-editor_tool-button"]`), + ...document.querySelectorAll(`button[class*="sound-editor_round-button"]`), + ...document.querySelectorAll(`span[class*="tool-select-base_mod-tool-select"]`), + /* Project Controls */ + ...document.querySelectorAll(`div[class^="controls_controls-container"] img`), + /* Blockly Zoom */ + ...document.querySelectorAll(`g[class="blocklyZoom"] image`), + ]); + } + + classMapper.forEach((elements, classN) => { + for (const element of elements) { + if (!element) continue; + element.classList.add(addonKey + classN); + } + }); + needsInit = false; + } + + function tryPatchScratchBlocks() { + if (typeof ScratchBlocks !== "object") return; + sbPatched = true; + + // some modals are from ScratchBlocks, patch them! + queueMicrotask(() => { + const ogSBPrompt = ScratchBlocks.prompt; + ScratchBlocks.prompt = function(...args) { + ogSBPrompt.call(this, ...args); + + handleOpenAnimation("modal"); + attachCloseHijack("modal"); + } + + if (sbEverPatched) return; + sbEverPatched = true; + + const ogSBProcCreate = ScratchBlocks.Procedures.createProcedureDefCallback_ + ScratchBlocks.Procedures.createProcedureDefCallback_ = function(...args) { + ogSBProcCreate.call(this, ...args); + + handleOpenAnimation("modal"); + attachCloseHijack("modal"); + } + const ogSBProcEdit = ScratchBlocks.Procedures.editProcedureCallback_; + ScratchBlocks.Procedures.editProcedureCallback_ = function(...args) { + ogSBProcEdit.call(this, ...args); + + handleOpenAnimation("modal"); + attachCloseHijack("modal"); + } + const ogContextMenuShow = ScratchBlocks.ContextMenu.show; + ScratchBlocks.ContextMenu.show = function(...args) { + ogContextMenuShow.call(this, ...args); + handleOpenAnimation("ctxMenu"); + } + + /* this isnt a modal, but we still want to patch it for animations */ + const ogInitButton = ScratchBlocks.FlyoutButton.prototype.show; + ScratchBlocks.FlyoutButton.prototype.show = function(...args) { + ogInitButton.call(this, ...args); + queueMicrotask(() => compileClasses()); + } + }); + } + + function attachListeners() { + const spriteRow = document.querySelector(`div[class^="sprite-selector_items-wrapper"]`); + if (!spriteRow) return; + + document.addEventListener("contextmenu", (event) => { + let element = event.target.closest(`div[class*="sprite-selector_sprite-wrapper"]`); + if (element) element = element.firstChild; + else element = event.target.closest(`div[class^="react-contextmenu-wrapper"][class*="sprite-selector-item_sprite-selector"]`); + + if (element) { + setTimeout(() => { + element.querySelector("nav").style.opacity = 1; + handleOpenAnimation("guiCtxMenu"); + observeMenuScalers(element, true, ["class", "style"]); + }, 10); + } + }); + + listenerAttached = true; + } + + function startListenerWorker() { + const checkInEditor = () => !ReduxStore.getState().scratchGui.mode.isPlayerOnly; + + window.vm.on("workspaceUpdate", () => { + queueMicrotask(() => compileClasses()); + }); + + let lastModalStateID, inEditor; + ReduxStore.subscribe(() => { + const reduxState = ReduxStore.getState().scratchGui; + let entries = Object.entries(reduxState.modals); + entries.push(...Object.entries(reduxState.menus)); + const genID = [ + ...entries, ["tab", reduxState.editorTab.activeTabIndex] + ]; + const modalStateID = genID.map(entry => entry[1]).join("."); + + const currentlyInEditor = checkInEditor(); + if (inEditor !== currentlyInEditor) { + inEditor = currentlyInEditor; + if (inEditor) { + sbPatched = false; + listenerAttached = false; + } + } + + if (!sbPatched) tryPatchScratchBlocks(); + if (!listenerAttached) attachListeners(); + + if (!needsInit && lastModalStateID === modalStateID) return; + lastModalStateID = modalStateID; + queueMicrotask(() => { + compileClasses(); + for (const entry of entries) { + if (entry[1] === true) { + const name = entry[0]; + handleOpenAnimation(name); + attachCloseHijack(name); + compileClasses(name.endsWith("Library") ? name : undefined); + break; + } + } + }); + }); + } + + if (typeof scaffolding === "undefined") startListenerWorker(); + + addon.settings.addEventListener("change", requestAddonState); + addon.self.addEventListener("disabled", () => { + animateModals = false; + animateLibraries = false; + animateButtons = false; + }); + addon.self.addEventListener("reenabled", () => { + animateModals = true; + animateLibraries = true; + animateButtons = true; + }); +} \ No newline at end of file diff --git a/src/addons/addons/editor-block-chomping/_manifest_entry.js b/src/addons/addons/editor-block-chomping/_manifest_entry.js new file mode 100644 index 0000000000000000000000000000000000000000..dfa9667b7a2bab55469a97377e7a822a76e912e9 --- /dev/null +++ b/src/addons/addons/editor-block-chomping/_manifest_entry.js @@ -0,0 +1,21 @@ +/* generated by pull.js */ +const manifest = { + "name": "Extend wrapped C blocks", + "description": "Makes C blocks extend when wrapping them around blocks, like in Scratch 2.0.", + "credits": [ + { + "name": "CST1229", + "link": "https://github.com/CST1229/" + } + ], + "userscripts": [ + { + "url": "userscript.js" + } + ], + "tags": ["editor", "codeEditor", "new", "beta"], + "enabledByDefault": false, + "dynamicEnable": true, + "dynamicDisable": true +}; +export default manifest; diff --git a/src/addons/addons/editor-block-chomping/_runtime_entry.js b/src/addons/addons/editor-block-chomping/_runtime_entry.js new file mode 100644 index 0000000000000000000000000000000000000000..bc67131957e52185c142f348760610cfaa4f774d --- /dev/null +++ b/src/addons/addons/editor-block-chomping/_runtime_entry.js @@ -0,0 +1,5 @@ +/* generated by pull.js */ +import _js from "./userscript.js"; +export const resources = { + "userscript.js": _js, +}; diff --git a/src/addons/addons/editor-block-chomping/userscript.js b/src/addons/addons/editor-block-chomping/userscript.js new file mode 100644 index 0000000000000000000000000000000000000000..4f001633fbe7c32ac7298673df86f02cb9f54d6b --- /dev/null +++ b/src/addons/addons/editor-block-chomping/userscript.js @@ -0,0 +1,74 @@ +export default async function ({ addon }) { + const ScratchBlocks = await addon.tab.traps.getBlockly(); + + // Rerender the dragged block when updating the insertion marker + const ogConnectMarker = ScratchBlocks.InsertionMarkerManager.prototype.connectMarker_; + ScratchBlocks.InsertionMarkerManager.prototype.connectMarker_ = function () { + ogConnectMarker.call(this); + if (!addon.self.disabled && this.firstMarker_) { + const block = this?.workspace_?.currentGesture_?.blockDragger_?.draggingBlock_; + block.noMoveConnection = true; + if (block) block.render(false); + } + }; + const ogDisconnectMarker = ScratchBlocks.InsertionMarkerManager.prototype.disconnectMarker_; + ScratchBlocks.InsertionMarkerManager.prototype.disconnectMarker_ = function () { + ogDisconnectMarker.call(this); + if (!addon.self.disabled && this.firstMarker_) { + const block = this?.workspace_?.currentGesture_?.blockDragger_?.draggingBlock_; + block.noMoveConnection = true; + if (block) block.render(false); + } + }; + + const ogDraw = ScratchBlocks.BlockSvg.prototype.renderDraw_; + const ogMoveConnections = ScratchBlocks.BlockSvg.prototype.renderMoveConnections_; + ScratchBlocks.BlockSvg.prototype.renderDraw_ = function (iconWidth, inputRows) { + if (addon.self.disabled) return ogDraw.call(this, iconWidth, inputRows); + + // If the block contains a statement (C) input and has an insertion marker, + // use that to calculate the height of the statement inputs + let computeBlock = this; + if (this?.workspace?.currentGesture_?.blockDragger_?.draggedConnectionManager_) { + const dragger = this.workspace.currentGesture_.blockDragger_; + const manager = dragger.draggedConnectionManager_; + if ( + manager.markerConnection_ && + manager.firstMarker_ && + dragger.draggingBlock_ == this && + dragger.draggingBlock_.type == manager.firstMarker_.type + ) { + if (inputRows.some((row) => row.some((input) => input.type === ScratchBlocks.NEXT_STATEMENT))) { + computeBlock = manager.firstMarker_; + } + } + } + + // Change the height of substacks + // (If we set inputRows to computeBlock.renderCompute_, + // the references to the inputs would be wrong + // so they just won't update properly) + if (computeBlock !== this) { + const _inputRows = computeBlock.renderCompute_(iconWidth); + for (let i = 0; i < inputRows.length; i++) { + const row = inputRows[i]; + let update = false; + for (const input of row) { + if (input.type === ScratchBlocks.NEXT_STATEMENT) update = true; + } + if (update) row.height = Math.max(row.height, _inputRows[i].height); + } + } + + ogDraw.call(this, iconWidth, inputRows); + + // Moving the connections of a block while it's being dragged breaks it, + // so don't + if (computeBlock === this && !this.noMoveConnection) ogMoveConnections.call(this); + this.noMoveConnection = false; + }; + ScratchBlocks.BlockSvg.prototype.renderMoveConnections_ = function () { + if (addon.self.disabled) return ogMoveConnections.call(this); + // Do nothing (this function is instead called by renderDraw_) + }; +} \ No newline at end of file diff --git a/src/addons/addons/editor-buttons-reverse-order/_manifest_entry.js b/src/addons/addons/editor-buttons-reverse-order/_manifest_entry.js new file mode 100644 index 0000000000000000000000000000000000000000..fd13a38ef0345682e75cc821e2728d5052a7f7b3 --- /dev/null +++ b/src/addons/addons/editor-buttons-reverse-order/_manifest_entry.js @@ -0,0 +1,15 @@ +/* generated by pull.js */ +const manifest = { + "name": "Reverse order of project controls", + "description": "Moves the green flag and stop buttons to the right and the full screen button to the left, like in Scratch 2.0.", + "tags": [ + "theme" + ], + "dynamicDisable": true, + "userstyles": [ + { + "url": "userstyle.css" + } + ] +}; +export default manifest; diff --git a/src/addons/addons/editor-buttons-reverse-order/_runtime_entry.js b/src/addons/addons/editor-buttons-reverse-order/_runtime_entry.js new file mode 100644 index 0000000000000000000000000000000000000000..7258d9ba2794dad3eb667e6071b542c59e495b56 --- /dev/null +++ b/src/addons/addons/editor-buttons-reverse-order/_runtime_entry.js @@ -0,0 +1,5 @@ +/* generated by pull.js */ +import _css from "!css-loader!./userstyle.css"; +export const resources = { + "userstyle.css": _css, +}; diff --git a/src/addons/addons/editor-buttons-reverse-order/userstyle.css b/src/addons/addons/editor-buttons-reverse-order/userstyle.css new file mode 100644 index 0000000000000000000000000000000000000000..f72edc66ce0b051b7ec12ed7c6b50a51e14d44f8 --- /dev/null +++ b/src/addons/addons/editor-buttons-reverse-order/userstyle.css @@ -0,0 +1,24 @@ +[class*="stage-header_stage-menu-wrapper"], +[class*="stage-header_stage-size-row"] { + flex-direction: row-reverse; +} + +[dir="ltr"] [class*="stage-header_stage-size-toggle-group"], +[dir="ltr"] .sa-debugger-container, +[dir="ltr"] .sa-gamepad-container { + margin-right: 0; + margin-left: 0.2rem; +} + +[dir="rtl"] [class*="stage-header_stage-size-toggle-group"], +[dir="rtl"] .sa-debugger-container, +[dir="rtl"] .sa-gamepad-container { + margin-left: 0; + margin-right: 0.2rem; +} + +[class*="green-flag_green-flag_"], +[class*="stop-all_stop-all_"], +.pause-btn { + order: 1; +} diff --git a/src/addons/addons/editor-colored-context-menus/_manifest_entry.js b/src/addons/addons/editor-colored-context-menus/_manifest_entry.js new file mode 100644 index 0000000000000000000000000000000000000000..1a0368270c5cc634ce808c556e165b2d4c3be1ca --- /dev/null +++ b/src/addons/addons/editor-colored-context-menus/_manifest_entry.js @@ -0,0 +1,28 @@ +/* generated by pull.js */ +const manifest = { + "editorOnly": true, + "noTranslations": true, + "name": "Colored context menus", + "description": "Makes block right click context menus colorful.", + "credits": [ + { + "name": "GarboMuffin" + } + ], + "dynamicDisable": true, + "userscripts": [ + { + "url": "userscript.js" + } + ], + "userstyles": [ + { + "url": "userscript.css" + } + ], + "tags": [ + "theme" + ], + "enabledByDefault": true +}; +export default manifest; diff --git a/src/addons/addons/editor-colored-context-menus/_runtime_entry.js b/src/addons/addons/editor-colored-context-menus/_runtime_entry.js new file mode 100644 index 0000000000000000000000000000000000000000..7d9d3b5487a949dcd0e972e3066ce988a323038d --- /dev/null +++ b/src/addons/addons/editor-colored-context-menus/_runtime_entry.js @@ -0,0 +1,7 @@ +/* generated by pull.js */ +import _js from "./userscript.js"; +import _css from "!css-loader!./userscript.css"; +export const resources = { + "userscript.js": _js, + "userscript.css": _css, +}; diff --git a/src/addons/addons/editor-colored-context-menus/userscript.css b/src/addons/addons/editor-colored-context-menus/userscript.css new file mode 100644 index 0000000000000000000000000000000000000000..ea7d0f2bc8620b440f8f293af62ae9949a4c0792 --- /dev/null +++ b/src/addons/addons/editor-colored-context-menus/userscript.css @@ -0,0 +1,15 @@ +.sa-contextmenu-colored .blocklyContextMenu { + background-color: var(--sa-contextmenu-bg) !important; + border-color: var(--sa-contextmenu-border) !important; +} +.sa-contextmenu-colored .blocklyContextMenu .goog-menuitem-highlight, +.sa-contextmenu-colored .s3dev-mi:hover { + background-color: #0001; + border-color: transparent !important; +} +.sa-contextmenu-colored .blocklyContextMenu .goog-menuitem[style*="border-top"] { + border-top-color: var(--sa-contextmenu-border) !important; +} +.sa-contextmenu-colored .blocklyContextMenu .goog-menuitem .goog-menuitem-content { + color: white; +} diff --git a/src/addons/addons/editor-colored-context-menus/userscript.js b/src/addons/addons/editor-colored-context-menus/userscript.js new file mode 100644 index 0000000000000000000000000000000000000000..923dba2c165ed3e32816a2ee4f3daeafb3d21c80 --- /dev/null +++ b/src/addons/addons/editor-colored-context-menus/userscript.js @@ -0,0 +1,39 @@ +import { removeAlpha } from "../../libraries/common/cs/text-color.esm.js"; + +export default async function ({ addon, console }) { + const ScratchBlocks = await addon.tab.traps.getBlockly(); + + const applyContextMenuColor = (block) => { + const widgetDiv = ScratchBlocks.WidgetDiv.DIV; + if (!widgetDiv) { + return; + } + const background = block.svgPath_; + if (!background) { + return; + } + const fill = removeAlpha(background.getAttribute("fill")); + const border = background.getAttribute("stroke") || "#0003"; + widgetDiv.classList.add("sa-contextmenu-colored"); + widgetDiv.style.setProperty("--sa-contextmenu-bg", fill); + widgetDiv.style.setProperty("--sa-contextmenu-border", border); + }; + + const originalHandleRightClick = ScratchBlocks.Gesture.prototype.handleRightClick; + ScratchBlocks.Gesture.prototype.handleRightClick = function (...args) { + const block = this.targetBlock_; + const ret = originalHandleRightClick.call(this, ...args); + if (block) { + applyContextMenuColor(block); + } + return ret; + }; + + const originalHide = ScratchBlocks.WidgetDiv.hide; + ScratchBlocks.WidgetDiv.hide = function (...args) { + if (ScratchBlocks.WidgetDiv.DIV) { + ScratchBlocks.WidgetDiv.DIV.classList.remove("sa-contextmenu-colored"); + } + return originalHide.call(this, ...args); + }; +} diff --git a/src/addons/addons/editor-comment-previews/_manifest_entry.js b/src/addons/addons/editor-comment-previews/_manifest_entry.js new file mode 100644 index 0000000000000000000000000000000000000000..956ec93ae72d99deca97341940b8c835f820076a --- /dev/null +++ b/src/addons/addons/editor-comment-previews/_manifest_entry.js @@ -0,0 +1,95 @@ +/* generated by pull.js */ +const manifest = { + "editorOnly": true, + "noTranslations": true, + "name": "Editor comment previews", + "description": "Allows you to preview the contents of comments by hovering over collapsed comments and blocks. You can use this to view comments that are off-screen, identify a loop block from the bottom by its preview, fit many long comments in a small space, and more.", + "tags": [], + "credits": [ + { + "name": "lisa_wolfgang", + "link": "https://scratch.mit.edu/users/lisa_wolfgang/" + }, + { + "name": "GarboMuffin" + } + ], + "userstyles": [ + { + "url": "userstyle.css" + } + ], + "userscripts": [ + { + "url": "userscript.js" + } + ], + "settings": [ + { + "dynamic": true, + "name": "Hover collapsed comments to preview", + "id": "hover-view", + "type": "boolean", + "default": true + }, + { + "dynamic": true, + "name": "Hover blocks to preview attached comments", + "id": "hover-view-block", + "type": "boolean", + "default": true + }, + { + "dynamic": true, + "name": "Hover custom blocks to preview definition comments", + "id": "hover-view-procedure", + "type": "boolean", + "default": true + }, + { + "dynamic": true, + "name": "Delay duration", + "id": "delay", + "type": "select", + "potentialValues": [ + { + "name": "None", + "id": "none" + }, + { + "name": "Short", + "id": "short" + }, + { + "name": "Long", + "id": "long" + } + ], + "default": "short" + }, + { + "dynamic": true, + "name": "Follow mouse", + "id": "follow-mouse", + "type": "boolean", + "default": true + }, + { + "dynamic": true, + "name": "Reduce transparency", + "id": "reduce-transparency", + "type": "boolean", + "default": false + }, + { + "dynamic": true, + "name": "Reduce animation", + "id": "reduce-animation", + "type": "boolean", + "default": false + } + ], + "dynamicDisable": true, + "enabledByDefault": true +}; +export default manifest; diff --git a/src/addons/addons/editor-comment-previews/_runtime_entry.js b/src/addons/addons/editor-comment-previews/_runtime_entry.js new file mode 100644 index 0000000000000000000000000000000000000000..e8d1f9d053dfbf3603b17200d244fda9ead99731 --- /dev/null +++ b/src/addons/addons/editor-comment-previews/_runtime_entry.js @@ -0,0 +1,7 @@ +/* generated by pull.js */ +import _js from "./userscript.js"; +import _css from "!css-loader!./userstyle.css"; +export const resources = { + "userscript.js": _js, + "userstyle.css": _css, +}; diff --git a/src/addons/addons/editor-comment-previews/userscript.js b/src/addons/addons/editor-comment-previews/userscript.js new file mode 100644 index 0000000000000000000000000000000000000000..27e388545e29063a83784eab8f36aa757d5ff3cd --- /dev/null +++ b/src/addons/addons/editor-comment-previews/userscript.js @@ -0,0 +1,151 @@ +export default async function ({ addon, console }) { + const vm = addon.tab.traps.vm; + + const updateStyles = () => { + previewInner.classList.toggle("sa-comment-preview-delay", addon.settings.get("delay") !== "none"); + previewInner.classList.toggle("sa-comment-preview-reduce-transparency", addon.settings.get("reduce-transparency")); + previewInner.classList.toggle("sa-comment-preview-fade", !addon.settings.get("reduce-animation")); + }; + + const afterDelay = (cb) => { + if (!previewInner.classList.contains("sa-comment-preview-hidden")) { + // If not hidden, updating immediately is preferred + cb(); + return; + } + const delay = addon.settings.get("delay"); + if (delay === "long") return setTimeout(cb, 500); + if (delay === "short") return setTimeout(cb, 300); + cb(); + }; + + let hoveredElement = null; + let showTimeout = null; + let mouseX = 0; + let mouseY = 0; + let doNotShowUntilMoveMouse = false; + + const previewOuter = document.createElement("div"); + previewOuter.classList.add("sa-comment-preview-outer"); + const previewInner = document.createElement("div"); + previewInner.classList.add("sa-comment-preview-inner"); + previewInner.classList.add("sa-comment-preview-hidden"); + updateStyles(); + addon.settings.addEventListener("change", updateStyles); + previewOuter.appendChild(previewInner); + document.body.appendChild(previewOuter); + + const getBlock = (id) => vm.editingTarget.blocks.getBlock(id) || vm.runtime.flyoutBlocks.getBlock(id); + const getComment = (block) => block && block.comment && vm.editingTarget.comments[block.comment]; + const getProcedureDefinitionBlock = (procCode) => { + const procedurePrototype = Object.values(vm.editingTarget.blocks._blocks).find( + (i) => i.opcode === "procedures_prototype" && i.mutation.proccode === procCode + ); + if (procedurePrototype) { + // Usually `parent` will exist but sometimes it doesn't + if (procedurePrototype.parent) { + return getBlock(procedurePrototype.parent); + } + const id = procedurePrototype.id; + return Object.values(vm.editingTarget.blocks._blocks).find( + (i) => (i.opcode === "procedures_definition" || i.opcode === "procedures_definition_return") && i.inputs.custom_block && i.inputs.custom_block.block === id + ); + } + return null; + }; + + const setText = (text) => { + previewInner.innerText = text; + previewInner.classList.remove("sa-comment-preview-hidden"); + updateMousePosition(); + }; + + const updateMousePosition = () => { + previewOuter.style.transform = `translate(${mouseX + 8}px, ${mouseY + 8}px)`; + }; + + const hidePreview = () => { + if (hoveredElement) { + hoveredElement = null; + previewInner.classList.add("sa-comment-preview-hidden"); + } + }; + + document.addEventListener("mouseover", (e) => { + if (addon.self.disabled) { + return; + } + clearTimeout(showTimeout); + if (doNotShowUntilMoveMouse) { + return; + } + + const el = e.target.closest(".blocklyBubbleCanvas > g, .blocklyBlockCanvas .blocklyDraggable[data-id]"); + if (el === hoveredElement) { + // Nothing to do. + return; + } + if (!el) { + hidePreview(); + return; + } + + let text = null; + if ( + addon.settings.get("hover-view") && + e.target.closest(".blocklyBubbleCanvas > g") && + // Hovering over the thin line that connects comments to blocks should never show a preview + !e.target.closest("line") + ) { + const collapsedText = el.querySelector("text.scratchCommentText"); + if (!collapsedText) return; + if (collapsedText.getAttribute("display") !== "none") { + const textarea = el.querySelector("textarea"); + text = textarea.value; + } + } else if (e.target.closest(".blocklyBlockCanvas .blocklyDraggable[data-id]")) { + const id = el.dataset.id; + const block = getBlock(id); + const comment = getComment(block); + if (addon.settings.get("hover-view-block") && comment) { + text = comment.text; + } else if (block && block.opcode === "procedures_call" && addon.settings.get("hover-view-procedure")) { + const procCode = block.mutation.proccode; + const procedureDefinitionBlock = getProcedureDefinitionBlock(procCode); + const procedureComment = getComment(procedureDefinitionBlock); + if (procedureComment) { + text = procedureComment.text; + } + } + } + + if (text !== null && text.trim() !== "") { + showTimeout = afterDelay(() => { + hoveredElement = el; + setText(text); + }); + } else { + hidePreview(); + } + }); + + document.addEventListener("mousemove", (e) => { + mouseX = e.clientX; + mouseY = e.clientY; + doNotShowUntilMoveMouse = false; + if (addon.settings.get("follow-mouse") && !previewInner.classList.contains("sa-comment-preview-hidden")) { + updateMousePosition(); + } + }); + + document.addEventListener( + "mousedown", + () => { + hidePreview(); + doNotShowUntilMoveMouse = true; + }, + { + capture: true, + } + ); +} diff --git a/src/addons/addons/editor-comment-previews/userstyle.css b/src/addons/addons/editor-comment-previews/userstyle.css new file mode 100644 index 0000000000000000000000000000000000000000..7bd0effd112049ee6ef5d1c6cf2f210a13c5aeee --- /dev/null +++ b/src/addons/addons/editor-comment-previews/userstyle.css @@ -0,0 +1,48 @@ +.sa-comment-preview-outer { + position: fixed; + top: 0; + left: 0; + z-index: 100000000; + pointer-events: none; +} + +.sa-comment-preview-inner { + width: calc(200px - 16px); + max-height: calc(132px - 8px); + padding: 8px; + overflow: hidden; + + font-size: 12px; + white-space: pre-wrap; + pointer-events: none; + + color: rgb(87, 94, 117); + background-color: rgb(255 255 255 / 90%); + border-style: none; + border-radius: 8px; + filter: drop-shadow(0px 5px 5px rgb(0 0 0 / 10%)); + + transform: perspective(200px); +} + +@supports (backdrop-filter: blur(16px)) { + .sa-comment-preview-inner { + background-color: rgb(255 255 255 / 75%); + backdrop-filter: blur(16px); + } +} + +.sa-comment-preview-fade { + transition: opacity 0.1s, filter 0.1s, transform 0.1s linear; +} + +.sa-comment-preview-hidden { + opacity: 0; + filter: none; + transform: perspective(200px) translateZ(-20px); +} + +.sa-comment-preview-reduce-transparency { + background-color: rgb(255 255 255); + backdrop-filter: none; +} diff --git a/src/addons/addons/editor-devtools/DevTools.js b/src/addons/addons/editor-devtools/DevTools.js new file mode 100644 index 0000000000000000000000000000000000000000..e2106f976429317de40c7d915e0c4007b4220fb9 --- /dev/null +++ b/src/addons/addons/editor-devtools/DevTools.js @@ -0,0 +1,754 @@ +// import ShowBroadcast from "./show-broadcast.js"; +import DomHelpers from "./DomHelpers.js"; +import UndoGroup from "./UndoGroup.js"; + +export default class DevTools { + constructor(addon, msg, m) { + this.addon = addon; + this.msg = msg; + this.m = m; + /** + * @type {VirtualMachine} + */ + this.domHelpers = new DomHelpers(addon); + + this.codeTab = null; + this.costTab = null; + this.costTabBody = null; + this.selVarID = null; + this.canShare = false; + + this.mouseXY = { x: 0, y: 0 }; + } + + async init() { + this.addContextMenus(); + while (true) { + const root = await this.addon.tab.waitForElement("ul[class*=gui_tab-list_]", { + markAsSeen: true, + reduxEvents: [ + "scratch-gui/mode/SET_PLAYER", + "fontsLoaded/SET_FONTS_LOADED", + "scratch-gui/locales/SELECT_LOCALE", + ], + reduxCondition: (state) => !state.scratchGui.mode.isPlayerOnly, + }); + this.initInner(root); + } + } + async addContextMenus() { + const blockly = await this.addon.tab.traps.getBlockly(); + const oldCleanUpFunc = blockly.WorkspaceSvg.prototype.cleanUp; + const self = this; + blockly.WorkspaceSvg.prototype.cleanUp = function () { + if (self.addon.settings.get("enableCleanUpPlus")) { + self.doCleanUp(); + } else { + oldCleanUpFunc.call(this); + } + }; + + let originalMsg = blockly.Msg.CLEAN_UP; + if (this.addon.settings.get("enableCleanUpPlus")) blockly.Msg.CLEAN_UP = this.m("clean-plus"); + this.addon.settings.addEventListener("change", () => { + if (this.addon.settings.get("enableCleanUpPlus")) blockly.Msg.CLEAN_UP = this.m("clean-plus"); + else blockly.Msg.CLEAN_UP = originalMsg; + }); + + this.addon.tab.createBlockContextMenu( + (items, block) => { + items.push({ + enabled: blockly.clipboardXml_, + text: this.m("paste"), + separator: true, + _isDevtoolsFirstItem: true, + callback: () => { + let ids = this.getTopBlockIDs(); + + document.dispatchEvent( + new KeyboardEvent("keydown", { + keyCode: 86, + ctrlKey: true, + griff: true, + }) + ); + + setTimeout(() => { + this.beginDragOfNewBlocksNotInIDs(ids); + }, 10); + }, + }); + return items; + }, + { workspace: true } + ); + this.addon.tab.createBlockContextMenu( + (items, block) => { + items.push( + { + enabled: true, + text: this.m("make-space"), + _isDevtoolsFirstItem: true, + callback: () => { + this.doCleanUp(block); + }, + separator: true, + }, + { + enabled: true, + text: this.m("copy-all"), + callback: () => { + this.eventCopyClick(block); + }, + separator: true, + }, + { + enabled: true, + text: this.m("copy-block"), + callback: () => { + this.eventCopyClick(block, 1); + }, + }, + { + enabled: true, + text: this.m("cut-block"), + callback: () => { + this.eventCopyClick(block, 2); + }, + } + ); + // const BROADCAST_BLOCKS = ["event_whenbroadcastreceived", "event_broadcast", "event_broadcastandwait"]; + // if (BROADCAST_BLOCKS.includes(block.type)) { + // // Show Broadcast + // const broadcastId = this.showBroadcastSingleton.getAssociatedBroadcastId(block.id); + // if (broadcastId) { + // ["Senders", "Receivers"].forEach((showKey, i) => { + // items.push({ + // enabled: true, + // text: this.msg(`show-${showKey}`.toLowerCase()), + // callback: () => { + // this.showBroadcastSingleton[`show${showKey}`](broadcastId); + // }, + // separator: i == 0, + // }); + // }); + // } + // } + return items; + }, + { blocks: true } + ); + this.addon.tab.createBlockContextMenu( + (items, block) => { + if (block.getCategory() === "data" || block.getCategory() === "data-lists") { + this.selVarID = block.getVars()[0]; + items.push({ + enabled: true, + text: this.m("swap", { var: block.getCategory() === "data" ? this.m("variables") : this.m("lists") }), + callback: async () => { + let wksp = this.getWorkspace(); + let v = wksp.getVariableById(this.selVarID); + // prompt() returns Promise in desktop app + let varName = await window.prompt(this.msg("replace", { name: v.name })); + if (varName) { + this.doReplaceVariable(this.selVarID, varName, v.type); + } + }, + separator: true, + }); + } + return items; + }, + { blocks: true, flyout: true } + ); + } + + getWorkspace() { + return Blockly.getMainWorkspace(); + } + + isCostumeEditor() { + return this.costTab.className.indexOf("gui_is-selected") >= 0; + } + + /** + * A nicely ordered version of the top blocks + * @returns {[Blockly.Block]} + */ + getTopBlocks() { + let result = this.getOrderedTopBlockColumns(); + let columns = result.cols; + /** + * @type {[[Blockly.Block]]} + */ + let topBlocks = []; + for (const col of columns) { + topBlocks = topBlocks.concat(col.blocks); + } + return topBlocks; + } + + /** + * A much nicer way of laying out the blocks into columns + */ + doCleanUp(block) { + let workspace = this.getWorkspace(); + let makeSpaceForBlock = block && block.getRootBlock(); + + UndoGroup.startUndoGroup(workspace); + + let result = this.getOrderedTopBlockColumns(true); + let columns = result.cols; + let orphanCount = result.orphans.blocks.length; + if (orphanCount > 0 && !block) { + let message = this.msg("orphaned", { + count: orphanCount, + }); + if (confirm(message)) { + for (const block of result.orphans.blocks) { + block.dispose(); + } + } else { + columns.unshift(result.orphans); + } + } + + let cursorX = 48; + + let maxWidths = result.maxWidths; + + for (const column of columns) { + let cursorY = 64; + let maxWidth = 0; + + for (const block of column.blocks) { + let extraWidth = block === makeSpaceForBlock ? 380 : 0; + let extraHeight = block === makeSpaceForBlock ? 480 : 72; + let xy = block.getRelativeToSurfaceXY(); + if (cursorX - xy.x !== 0 || cursorY - xy.y !== 0) { + block.moveBy(cursorX - xy.x, cursorY - xy.y); + } + let heightWidth = block.getHeightWidth(); + cursorY += heightWidth.height + extraHeight; + + let maxWidthWithComments = maxWidths[block.id] || 0; + maxWidth = Math.max(maxWidth, Math.max(heightWidth.width + extraWidth, maxWidthWithComments)); + } + + cursorX += maxWidth + 96; + } + + let topComments = workspace.getTopComments(); + for (const comment of topComments) { + if (comment.setVisible) { + comment.setVisible(false); + comment.needsAutoPositioning_ = true; + comment.setVisible(true); + } + } + + setTimeout(() => { + // Locate unused local variables... + let workspace = this.getWorkspace(); + let map = workspace.getVariableMap(); + let vars = map.getVariablesOfType(""); + let unusedLocals = []; + + for (const row of vars) { + if (row.isLocal) { + let usages = map.getVariableUsesById(row.getId()); + if (!usages || usages.length === 0) { + unusedLocals.push(row); + } + } + } + + if (unusedLocals.length > 0) { + const unusedCount = unusedLocals.length; + let message = this.msg("unused-var", { + count: unusedCount, + }); + for (let i = 0; i < unusedLocals.length; i++) { + let orphan = unusedLocals[i]; + if (i > 0) { + message += ", "; + } + message += orphan.name; + } + if (confirm(message)) { + for (const orphan of unusedLocals) { + workspace.deleteVariableById(orphan.getId()); + } + } + } + + // Locate unused local lists... + let lists = map.getVariablesOfType("list"); + let unusedLists = []; + + for (const row of lists) { + if (row.isLocal) { + let usages = map.getVariableUsesById(row.getId()); + if (!usages || usages.length === 0) { + unusedLists.push(row); + } + } + } + if (unusedLists.length > 0) { + const unusedCount = unusedLists.length; + let message = this.msg("unused-list", { + count: unusedCount, + }); + for (let i = 0; i < unusedLists.length; i++) { + let orphan = unusedLists[i]; + if (i > 0) { + message += ", "; + } + message += orphan.name; + } + if (confirm(message)) { + for (const orphan of unusedLists) { + workspace.deleteVariableById(orphan.getId()); + } + } + } + + UndoGroup.endUndoGroup(workspace); + }, 100); + } + + /** + * Badly Orphaned - might want to delete these! + * @param topBlock + * @returns {boolean} + */ + isBlockAnOrphan(topBlock) { + return !!topBlock.outputConnection; + } + + /** + * Split the top blocks into ordered columns + * @param separateOrphans true to keep all orphans separate + * @returns {{orphans: {blocks: [Block], x: number, count: number}, cols: [Col]}} + */ + getOrderedTopBlockColumns(separateOrphans) { + let w = this.getWorkspace(); + let topBlocks = w.getTopBlocks(); + let maxWidths = {}; + + if (separateOrphans) { + let topComments = w.getTopComments(); + + // todo: tie comments to blocks... find widths and width of block stack row... + for (const comment of topComments) { + // comment.autoPosition_(); + // Hiding and showing repositions the comment right next to it's block - nice! + if (comment.setVisible) { + comment.setVisible(false); + comment.needsAutoPositioning_ = true; + comment.setVisible(true); + + // let bb = comment.block_.svgPath_.getBBox(); + let right = comment.getBoundingRectangle().bottomRight.x; + + // Get top block for stack... + let root = comment.block_.getRootBlock(); + let left = root.getBoundingRectangle().topLeft.x; + maxWidths[root.id] = Math.max(right - left, maxWidths[root.id] || 0); + } + } + } + + // Default scratch ordering is horrid... Lets try something more clever. + + /** + * @type {Col[]} + */ + let cols = []; + const TOLERANCE = 256; + let orphans = { x: -999999, count: 0, blocks: [] }; + + for (const topBlock of topBlocks) { + // let r = b.getBoundingRectangle(); + let position = topBlock.getRelativeToSurfaceXY(); + /** + * @type {Col} + */ + let bestCol = null; + let bestError = TOLERANCE; + + if (separateOrphans && this.isBlockAnOrphan(topBlock)) { + orphans.blocks.push(topBlock); + continue; + } + + // Find best columns + for (const col of cols) { + let err = Math.abs(position.x - col.x); + if (err < bestError) { + bestError = err; + bestCol = col; + } + } + + if (bestCol) { + // We found a column that we fitted into + bestCol.x = (bestCol.x * bestCol.count + position.x) / ++bestCol.count; // re-average the columns as more items get added... + bestCol.blocks.push(topBlock); + } else { + // Create a new column + cols.push(new Col(position.x, 1, [topBlock])); + } + } + + // if (orphans.blocks.length > 0) { + // cols.push(orphans); + // } + + // Sort columns, then blocks inside the columns + cols.sort((a, b) => a.x - b.x); + for (const col of cols) { + col.blocks.sort((a, b) => a.getRelativeToSurfaceXY().y - b.getRelativeToSurfaceXY().y); + } + + return { cols: cols, orphans: orphans, maxWidths: maxWidths }; + } + + /** + * Find all the uses of a named variable. + * @param {string} id ID of the variable to find. + * @return {!Array.} Array of block usages. + */ + getVariableUsesById(id) { + let uses = []; + + let topBlocks = this.getTopBlocks(true); // todo: Confirm this was the right getTopBlocks? + for (const topBlock of topBlocks) { + /** @type {!Array} */ + let kids = topBlock.getDescendants(); + for (const block of kids) { + /** @type {!Array} */ + let blockVariables = block.getVarModels(); + if (blockVariables) { + for (const blockVar of blockVariables) { + if (blockVar.getId() === id) { + uses.push(block); + } + } + } + } + } + + return uses; + } + + /** + * Quick and dirty replace all instances of one variable / list with another variable / list + * @param varId original variable name + * @param newVarName new variable name + * @param type type of variable ("" = variable, anything else is a list? + */ + doReplaceVariable(varId, newVarName, type) { + let wksp = this.getWorkspace(); + let v = wksp.getVariable(newVarName, type); + if (!v) { + alert(this.msg("var-not-exist")); + return; + } + let newVId = v.getId(); + + UndoGroup.startUndoGroup(wksp); + let blocks = this.getVariableUsesById(varId); + for (const block of blocks) { + try { + if (type === "") { + block.getField("VARIABLE").setValue(newVId); + } else { + block.getField("LIST").setValue(newVId); + } + } catch (e) { + // ignore + } + } + UndoGroup.endUndoGroup(wksp); + } + + /* + function doInjectScripts(codeString) { + let w = getWorkspace(); + let xml = new XML(); // document.implementation.createDocument(null, "xml"); + let x = xml.xmlDoc.firstChild; + + let tree = math.parse(codeString); + console.log(tree); + + const binaryOperatorTypes = { + add: "operator_add", + subtract: "operator_subtract", + this.multiply: "operator_multiply", + divide: "operator_divide", + }; + + const BLOCK_TYPE = { + number: "math_number", + text: "text", + }; + + function translateMathToXml(x, tree, shadowType) { + let xShadowField = null; + if (shadowType) { + let xShadow = xml.newXml(x, "shadow", { type: shadowType }); + if (shadowType === BLOCK_TYPE.number) { + xShadowField = xml.newXml(xShadow, "field", { name: "NUM" }); + } else if (shadowType === BLOCK_TYPE.text) { + xShadowField = xml.newXml(xShadow, "field", { name: "TEXT" }); + } + } + + if (!tree || !tree.type) { + return; + } + + if (tree.type === "OperatorNode") { + let operatorType = binaryOperatorTypes[tree.fn]; + if (operatorType) { + let xOp = newXml(x, "block", { type: operatorType }); + translateMathToXml(xml.newXml(xOp, "value", { name: "NUM1" }), tree.args[0], BLOCK_TYPE.number); + translateMathToXml(xml.newXml(xOp, "value", { name: "NUM2" }), tree.args[1], BLOCK_TYPE.number); + return; + } + + return; + } + + if (tree.type === "ConstantNode") { + // number or text in quotes + if (xShadowField) { + xml.setAttr(xShadowField, { text: tree.value }); + } + return; + } + + if (tree.type === "SymbolNode") { + // variable + let xVar = xml.newXml(x, "block", { type: "data_variable" }); + xml.newXml(xVar, "field", { name: "VARIABLE", text: tree.name }); + return; + } + + if (tree.type === "FunctionNode") { + // Method Call + if (tree.fn.name === "join") { + let xOp = newXml(x, "block", { type: "operator_join" }); + translateMathToXml(xml.newXml(xOp, "value", { name: "STRING1" }), tree.args[0], BLOCK_TYPE.text); + translateMathToXml(xml.newXml(xOp, "value", { name: "STRING2" }), tree.args[1], BLOCK_TYPE.text); + return; + } + } + } + + translateMathToXml(x, tree); + console.log(x); + + let ids = Blockly.Xml.domToWorkspace(x, w); + console.log(ids); + } + */ + /* + function clickInject(e) { + let codeString = window.prompt("Griffpatch: Enter an expression (i.e. a+2*3)"); + if (codeString) { + doInjectScripts(codeString); + } + e.preventDefault(); + return false; + } + */ + + /** + * Returns a Set of the top blocks in this workspace / sprite + * @returns {Set} Set of top blocks + */ + getTopBlockIDs() { + let wksp = this.getWorkspace(); + let topBlocks = wksp.getTopBlocks(); + let ids = new Set(); + for (const block of topBlocks) { + ids.add(block.id); + } + return ids; + } + + /** + * Initiates a drag event for all block stacks except those in the set of ids. + * But why? - Because we know all the ids of the existing stacks before we paste / duplicate - so we can find the + * new stack by excluding all the known ones. + * @param ids Set of previously known ids + */ + beginDragOfNewBlocksNotInIDs(ids) { + if (!this.addon.settings.get("enablePasteBlocksAtMouse")) { + return; + } + let wksp = this.getWorkspace(); + let topBlocks = wksp.getTopBlocks(); + for (const block of topBlocks) { + if (!ids.has(block.id)) { + // console.log("I found a new block!!! - " + block.id); + // todo: move the block to the mouse pointer? + let mouseXYClone = { x: this.mouseXY.x, y: this.mouseXY.y }; + block.setIntersects(true); // fixes offscreen block pasting in Turbo Warp + this.domHelpers.triggerDragAndDrop(block.svgPath_, null, mouseXYClone); + } + } + } + + updateMousePosition(e) { + this.mouseXY.x = e.clientX; + this.mouseXY.y = e.clientY; + } + + eventMouseMove(e) { + this.updateMousePosition(e); + } + + eventKeyDown(e) { + const switchCostume = (up) => { + // todo: select previous costume + let selected = this.costTabBody.querySelector("div[class*='sprite-selector-item_is-selected']"); + let node = up ? selected.parentNode.previousSibling : selected.parentNode.nextSibling; + if (node) { + let wrapper = node.closest("div[class*=gui_flex-wrapper]"); + node.querySelector("div[class^='sprite-selector-item_sprite-name']").click(); + node.scrollIntoView({ + behavior: "auto", + block: "center", + inline: "start", + }); + wrapper.scrollTop = 0; + } + }; + + if (document.URL.indexOf("editor") <= 0) { + return; + } + + let ctrlKey = e.ctrlKey || e.metaKey; + + if (e.keyCode === 37 && ctrlKey) { + // Ctrl + Left Arrow Key + if (document.activeElement.tagName === "INPUT") { + return; + } + + if (this.isCostumeEditor()) { + switchCostume(true); + e.cancelBubble = true; + e.preventDefault(); + return true; + } + } + + if (e.keyCode === 39 && ctrlKey) { + // Ctrl + Right Arrow Key + if (document.activeElement.tagName === "INPUT") { + return; + } + + if (this.isCostumeEditor()) { + switchCostume(false); + e.cancelBubble = true; + e.preventDefault(); + return true; + } + } + + if (e.keyCode === 86 && ctrlKey && !e.griff) { + // Ctrl + V + // Set a timeout so we can take control of the paste after the event + let ids = this.getTopBlockIDs(); + setTimeout(() => { + this.beginDragOfNewBlocksNotInIDs(ids); + }, 10); + } + + // if (e.keyCode === 220 && (!document.activeElement || document.activeElement.tagName === 'INPUT')) { + // + // } + } + + eventCopyClick(block, blockOnly) { + let wksp = this.getWorkspace(); + + if (block) { + block.select(); + let next = blockOnly ? block.getNextBlock() : null; + if (next) { + next.unplug(false); // setParent(null); + } + + // separate child temporarily + document.dispatchEvent(new KeyboardEvent("keydown", { keyCode: 67, ctrlKey: true })); + if (next || blockOnly === 2) { + setTimeout(() => { + if (next) { + wksp.undo(); // undo the unplug above... + } + if (blockOnly === 2) { + UndoGroup.startUndoGroup(wksp); + block.dispose(true); + UndoGroup.endUndoGroup(wksp); + } + }, 0); + } + } + } + + eventMouseDown(e) { + this.updateMousePosition(e); + } + + eventMouseUp(e) { + this.updateMousePosition(e); + } + + initInner(root) { + let guiTabs = root.childNodes; + + if (this.codeTab && guiTabs[0] !== this.codeTab) { + // We have been CHANGED!!! - Happens when going to project page, and then back inside again!!! + this.domHelpers.unbindAllEvents(); + } + + this.codeTab = guiTabs[0]; + this.costTab = guiTabs[1]; + this.costTabBody = document.querySelector("div[aria-labelledby=" + this.costTab.id + "]"); + + this.domHelpers.bindOnce(document, "keydown", (...e) => this.eventKeyDown(...e), true); + this.domHelpers.bindOnce(document, "mousemove", (...e) => this.eventMouseMove(...e), true); + this.domHelpers.bindOnce(document, "mousedown", (...e) => this.eventMouseDown(...e), true); // true to capture all mouse downs 'before' the dom events handle them + this.domHelpers.bindOnce(document, "mouseup", (...e) => this.eventMouseUp(...e), true); + } +} + +class Col { + /** + * @param x {Number} x position (for ordering) + * @param count {Number} + * @param blocks {[Block]} + */ + constructor(x, count, blocks) { + /** + * x position (for ordering) + * @type {Number} + */ + this.x = x; + /** + * @type {Number} + */ + this.count = count; + /** + * @type {[Blockly.Block]} + */ + this.blocks = blocks; + } +} diff --git a/src/addons/addons/editor-devtools/DomHelpers.js b/src/addons/addons/editor-devtools/DomHelpers.js new file mode 100644 index 0000000000000000000000000000000000000000..605ad29b82044dff0cb23a022d174fd40404cd2b --- /dev/null +++ b/src/addons/addons/editor-devtools/DomHelpers.js @@ -0,0 +1,106 @@ +export default class DomHelpers { + constructor(addon) { + this.addon = addon; + this.vm = addon.tab.traps.vm; + /** + * @type {eventDetails[]} + */ + this.events = []; + } + + /** + * Simulate a drag and drop programmatically through javascript + * @param selectorDrag + * @param selectorDrop + * @param mouseXY + * @param [shiftKey=false] + * @returns {boolean} + */ + triggerDragAndDrop(selectorDrag, selectorDrop, mouseXY, shiftKey) { + // function for triggering mouse events + shiftKey = shiftKey || false; + let fireMouseEvent = function (type, elem, centerX, centerY) { + let evt = document.createEvent("MouseEvents"); + evt.initMouseEvent(type, true, true, window, 1, 1, 1, centerX, centerY, shiftKey, false, false, false, 0, elem); + elem.dispatchEvent(evt); + }; + + // fetch target elements + let elemDrag = selectorDrag; // document.querySelector(selectorDrag); + let elemDrop = selectorDrop; // document.querySelector(selectorDrop); + if (!elemDrag /* || !elemDrop*/) { + return false; + } + + // calculate positions + let pos = elemDrag.getBoundingClientRect(); + let center1X = Math.floor((pos.left + pos.right) / 2); + let center1Y = Math.floor((pos.top + pos.bottom) / 2); + + // mouse over dragged element and mousedown + fireMouseEvent("mouseover", elemDrag, center1X, center1Y); + fireMouseEvent("mousedown", elemDrag, center1X, center1Y); + + // start dragging process over to drop target + fireMouseEvent("dragstart", elemDrag, center1X, center1Y); + fireMouseEvent("drag", elemDrag, center1X, center1Y); + fireMouseEvent("mousemove", elemDrag, center1X, center1Y); + + if (!elemDrop) { + if (mouseXY) { + // console.log(mouseXY); + let center2X = mouseXY.x; + let center2Y = mouseXY.y; + fireMouseEvent("drag", elemDrag, center2X, center2Y); + fireMouseEvent("mousemove", elemDrag, center2X, center2Y); + } + return false; + } + + pos = elemDrop.getBoundingClientRect(); + let center2X = Math.floor((pos.left + pos.right) / 2); + let center2Y = Math.floor((pos.top + pos.bottom) / 2); + + fireMouseEvent("drag", elemDrag, center2X, center2Y); + fireMouseEvent("mousemove", elemDrop, center2X, center2Y); + + // trigger dragging process on top of drop target + fireMouseEvent("mouseenter", elemDrop, center2X, center2Y); + fireMouseEvent("dragenter", elemDrop, center2X, center2Y); + fireMouseEvent("mouseover", elemDrop, center2X, center2Y); + fireMouseEvent("dragover", elemDrop, center2X, center2Y); + + // release dragged element on top of drop target + fireMouseEvent("drop", elemDrop, center2X, center2Y); + fireMouseEvent("dragend", elemDrag, center2X, center2Y); + fireMouseEvent("mouseup", elemDrag, center2X, center2Y); + + return true; + } + + bindOnce(dom, event, func, capture) { + capture = !!capture; + dom.removeEventListener(event, func, capture); + dom.addEventListener(event, func, capture); + this.events.push(new eventDetails(dom, event, func, capture)); + } + + unbindAllEvents() { + for (const event of this.events) { + event.dom.removeEventListener(event.event, event.func, event.capture); + } + this.events = []; + } +} + +/** + * A record of an event + */ +class eventDetails { + constructor(dom, event, func, capture) { + this.dom = dom; + this.event = event; + this.func = func; + this.capture = capture; + } +} diff --git a/src/addons/addons/editor-devtools/UndoGroup.js b/src/addons/addons/editor-devtools/UndoGroup.js new file mode 100644 index 0000000000000000000000000000000000000000..c08d677164a741335accfc4f0e99fff0e28bf890 --- /dev/null +++ b/src/addons/addons/editor-devtools/UndoGroup.js @@ -0,0 +1,47 @@ +/** + * This class is dedicated to maintaining the Undo stack of Blockly + * It allows us to initiate an undo group such that all subsequent operations are recorded as a single + * undoable transaction. + */ +export default class UndoGroup { + /** + * Start an Undo group - begin recording + * @param workspace the workspace + */ + static startUndoGroup(workspace) { + const undoStack = workspace.undoStack_; + if (undoStack.length) { + undoStack[undoStack.length - 1]._devtoolsLastUndo = true; + } + } + + /** + * End an Undo group - stops recording + * @param workspace the workspace + */ + static endUndoGroup(workspace) { + const undoStack = workspace.undoStack_; + // Events (responsible for undoStack updates) are delayed with a setTimeout(f, 0) + // https://github.com/LLK/scratch-blocks/blob/f159a1779e5391b502d374fb2fdd0cb5ca43d6a2/core/events.js#L182 + setTimeout(() => { + const group = generateUID(); + for (let i = undoStack.length - 1; i >= 0 && !undoStack[i]._devtoolsLastUndo; i--) { + undoStack[i].group = group; + } + }, 0); + } +} + +/** + * https://github.com/LLK/scratch-blocks/blob/f159a1779e5391b502d374fb2fdd0cb5ca43d6a2/core/events.js#L182 + * @returns {string} + * @private + */ +function generateUID() { + const CHARACTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!#$%()*+,-./:;=?@[]^_`{|}~"; + let result = ""; + for (let i = 0; i < 20; i++) { + result += CHARACTERS[Math.floor(Math.random() * CHARACTERS.length)]; + } + return result; +} diff --git a/src/addons/addons/editor-devtools/_manifest_entry.js b/src/addons/addons/editor-devtools/_manifest_entry.js new file mode 100644 index 0000000000000000000000000000000000000000..0a0db302f1ec6551fa08e68f5ea7b06d498450dc --- /dev/null +++ b/src/addons/addons/editor-devtools/_manifest_entry.js @@ -0,0 +1,37 @@ +/* generated by pull.js */ +const manifest = { + "editorOnly": true, + "name": "Developer tools", + "description": "Adds new menu options to the editor: copy/paste blocks, better clean up, and more!", + "credits": [ + { + "name": "griffpatch" + } + ], + "settings": [ + { + "dynamic": true, + "name": "Enhance \"Clean up Blocks\"", + "id": "enableCleanUpPlus", + "type": "boolean", + "default": true + }, + { + "dynamic": true, + "name": "Paste blocks at mouse cursor", + "id": "enablePasteBlocksAtMouse", + "type": "boolean", + "default": true + } + ], + "userscripts": [ + { + "url": "userscript.js" + } + ], + "tags": [ + "recommended" + ], + "enabledByDefault": true +}; +export default manifest; diff --git a/src/addons/addons/editor-devtools/_runtime_entry.js b/src/addons/addons/editor-devtools/_runtime_entry.js new file mode 100644 index 0000000000000000000000000000000000000000..59d4deed506d49eefd2f3fcf10fba5badc6c279c --- /dev/null +++ b/src/addons/addons/editor-devtools/_runtime_entry.js @@ -0,0 +1,7 @@ +/* generated by pull.js */ +import _js from "./userscript.js"; +import _asset from "!url-loader!./icon--close.svg"; +export const resources = { + "userscript.js": _js, + "icon--close.svg": _asset, +}; diff --git a/src/addons/addons/editor-devtools/icon--close.svg b/src/addons/addons/editor-devtools/icon--close.svg new file mode 100644 index 0000000000000000000000000000000000000000..9e5509e76a2296c93988ef8138eb61be814fb21a Binary files /dev/null and b/src/addons/addons/editor-devtools/icon--close.svg differ diff --git a/src/addons/addons/editor-devtools/show-broadcast.js b/src/addons/addons/editor-devtools/show-broadcast.js new file mode 100644 index 0000000000000000000000000000000000000000..4d441e7a422d9a7c5f1b0c559f08a6b0076f5641 --- /dev/null +++ b/src/addons/addons/editor-devtools/show-broadcast.js @@ -0,0 +1,110 @@ +// A file to split Editor Devtools by features. +// Unlike userscript.js, this file mainly interacts with VM. +export default class ShowBroadcast { + constructor(addon) { + this.addon = addon; + this.vm = this.addon.tab.traps.vm; + this.highlights = { + timeoutId: 0, + callback: () => {}, + }; + } + + showSenders(broadcastId) { + this.highlightTargets(this.getTargetsWithSenders(broadcastId)); + } + + getTargetsWithSenders(broadcastId) { + const targetWithSenders = []; + for (const target of this.vm.runtime.targets) { + if (!target.isOriginal) return; + for (const blockId of Object.keys(target.blocks._blocks)) { + const block = target.blocks.getBlock(blockId); + if (block.inputs.BROADCAST_INPUT) { + const input = block.inputs.BROADCAST_INPUT; + // For results, blocks must NOT be inserted, for convenience. + if ( + input.block === input.shadow && + target.blocks.getBlock(input.shadow).fields.BROADCAST_OPTION.id === broadcastId + ) { + targetWithSenders.push(target); + break; + } + } + } + } + return targetWithSenders; + } + + showReceivers(broadcastId) { + this.highlightTargets(this.getTargetsWithReceivers(broadcastId)); + } + + getTargetsWithReceivers(broadcastId) { + const targetWithReceivers = []; + for (const target of this.vm.runtime.targets) { + if (!target.isOriginal) return; + for (const blockId of Object.keys(target.blocks._blocks)) { + const block = target.blocks.getBlock(blockId); + if (block.opcode === "event_whenbroadcastreceived" && block.fields.BROADCAST_OPTION.id === broadcastId) { + targetWithReceivers.push(target); + break; + } + } + } + return targetWithReceivers; + } + + highlightTargets(targets) { + if (this.highlights.timeoutId) { + this.highlights.callback(); + clearTimeout(this.highlights.timeoutId); + this.highlights = { + timeoutId: 0, + callback: () => {}, + }; + } + const elemPendingToRemoveHighlights = []; + for (const target of targets) { + let elem = null; + if (target.isStage) { + elem = document.querySelector('div[class*="stage-selector_header"]'); + } else if (target.isOriginal) { + // This is one of the most ridiculous code I've ever written. + // This essentially compares sprite names to textContent so that we can add CSS. + const possibleElements = document.querySelectorAll('div[class*="sprite-selector-item_sprite-name"]'); + const spriteNameElem = Array.prototype.find.call( + possibleElements, + (elem) => elem.textContent === target.getName() + ); + if (!spriteNameElem) continue; + elem = spriteNameElem.parentElement; + } + elem.dataset.highlighted = "true"; + elemPendingToRemoveHighlights.push(elem); + } + const callbackFactory = (elemToRemoveHighlights) => () => { + for (const removingElem of elemToRemoveHighlights) { + if (!removingElem.isConnected) continue; + removingElem.dataset.highlighted = "false"; + } + }; + const callback = callbackFactory(elemPendingToRemoveHighlights); + this.highlights = { + callback, + timeoutId: setTimeout(callback, 2000), + }; + } + + getAssociatedBroadcastId(blockId) { + const editingTarget = this.vm.editingTarget; + const block = editingTarget.blocks.getBlock(blockId); + if (block.opcode === "event_whenbroadcastreceived") { + return block.fields.BROADCAST_OPTION.id; + } else { + const input = block.inputs.BROADCAST_INPUT; + // Allow shadow blocks + return editingTarget.blocks.getBlock(input.shadow).fields.BROADCAST_OPTION.id; + } + } +} diff --git a/src/addons/addons/editor-devtools/userscript.js b/src/addons/addons/editor-devtools/userscript.js new file mode 100644 index 0000000000000000000000000000000000000000..44e70aa56f72da4e59370f9854e37189a17b6024 --- /dev/null +++ b/src/addons/addons/editor-devtools/userscript.js @@ -0,0 +1,6 @@ +import DevTools from "./DevTools.js"; + +export default async function ({ addon, console, msg, safeMsg: m }) { + const devTools = new DevTools(addon, msg, m); + devTools.init(); +} diff --git a/src/addons/addons/editor-extra-keys/_manifest_entry.js b/src/addons/addons/editor-extra-keys/_manifest_entry.js new file mode 100644 index 0000000000000000000000000000000000000000..e6919b29720e9b6968e5150f2d695862822b5bd8 --- /dev/null +++ b/src/addons/addons/editor-extra-keys/_manifest_entry.js @@ -0,0 +1,63 @@ +/* generated by pull.js */ +const manifest = { + "editorOnly": true, + "name": "Extra key options", + "description": "Adds more keys to the \"key () pressed?\" and \"when () key pressed\" block dropdowns, such as enter, dot, comma, and more. These keys will work even for users who do not have this addon.", + "tags": [ + "beta" + ], + "credits": [ + { + "name": "Tacodiva", + "link": "https://scratch.mit.edu/users/Tacodiva7729/" + } + ], + "info": [ + { + "type": "notice", + "text": "The \"experimental keys\" include equals, slash, semicolon and more. They may not work on all operating systems or keyboard layouts.", + "id": "experimentalKeysWarn" + }, + { + "type": "notice", + "text": "The \"Shift keys\" include keys which typically require the Shift key and a number key, like hashtag, exclamation mark and more. These keys only work with the \"when () key pressed\" block and do not work on all operating systems or keyboard layouts.", + "id": "shiftKeysWarn" + }, + { + "type": "warning", + "text": "The \"TurboWarp keys\" will only work in TurboWarp, not in Scratch.", + "id": "twKeysWarn" + } + ], + "settings": [ + { + "dynamic": true, + "name": "Show experimental keys", + "id": "experimentalKeys", + "type": "boolean", + "default": true + }, + { + "dynamic": true, + "name": "Show Shift keys", + "id": "shiftKeys", + "type": "boolean", + "default": true + }, + { + "dynamic": true, + "name": "Show TurboWarp keys", + "id": "twKeys", + "type": "boolean", + "default": true + } + ], + "userscripts": [ + { + "url": "userscript.js" + } + ], + "dynamicDisable": true, + "enabledByDefault": true +}; +export default manifest; diff --git a/src/addons/addons/editor-extra-keys/_runtime_entry.js b/src/addons/addons/editor-extra-keys/_runtime_entry.js new file mode 100644 index 0000000000000000000000000000000000000000..bc67131957e52185c142f348760610cfaa4f774d --- /dev/null +++ b/src/addons/addons/editor-extra-keys/_runtime_entry.js @@ -0,0 +1,5 @@ +/* generated by pull.js */ +import _js from "./userscript.js"; +export const resources = { + "userscript.js": _js, +}; diff --git a/src/addons/addons/editor-extra-keys/userscript.js b/src/addons/addons/editor-extra-keys/userscript.js new file mode 100644 index 0000000000000000000000000000000000000000..3e23de6f882eece2954bad74323caa295c6abf44 --- /dev/null +++ b/src/addons/addons/editor-extra-keys/userscript.js @@ -0,0 +1,123 @@ +export default async function ({ addon, msg }) { + const ScratchBlocks = await addon.tab.traps.getBlockly(); + + let defaultKeys = null; + function appendKeys(keys, enableShiftKeys) { + if (!defaultKeys) { + defaultKeys = [...keys]; + } + if (!addon.self.disabled) { + keys.push( + ...[ + ["-", "-"], + [",", ","], + [".", "."], + ] + ); + keys.splice(5, 0, [msg("enter-key"), "enter"]); + if (addon.settings.get("experimentalKeys")) { + keys.push( + ...[ + ["`", "`"], + ["=", "="], + ["[", "["], + ["]", "]"], + ["\\", "\\"], + [";", ";"], + ["'", "'"], + ["/", "/"], + ] + ); + } + if (enableShiftKeys && addon.settings.get("shiftKeys")) { + keys.push( + ...[ + ["!", "!"], + ["@", "@"], + ["#", "#"], + ["$", "$"], + ["%", "%"], + ["^", "^"], + ["&", "&"], + ["*", "*"], + ["(", "("], + [")", ")"], + ["_", "_"], + ["+", "+"], + ["{", "{"], + ["}", "}"], + ["|", "|"], + [":", ":"], + ['"', '"'], + ["?", "?"], + ["<", "<"], + [">", ">"], + ["~", "~"], + ] + ); + } + if (addon.settings.get("twKeys")) { + keys.push( + ...[ + ["backspace", "backspace"], + ["delete", "delete"], + ["shift", "shift"], + ["caps lock", "caps lock"], + ["scroll lock", "scroll lock"], + ["control", "control"], + ["escape", "escape"], + ["insert", "insert"], + ["home", "home"], + ["end", "end"], + ["page up", "page up"], + ["page down", "page down"], + ] + ); + } + } + return keys; + } + + for (const opcode of ["sensing_keyoptions", "event_whenkeypressed", "event_whenkeyhit"]) { + const block = ScratchBlocks.Blocks[opcode]; + const originalInit = block.init; + block.init = function (...args) { + const originalJsonInit = this.jsonInit; + this.jsonInit = function (obj) { + appendKeys(obj.args0[0].options, opcode === "event_whenkeypressed" || opcode === "event_whenkeyhit"); + return originalJsonInit.call(this, obj); + }; + return originalInit.call(this, ...args); + }; + } + + const updateExistingBlocks = () => { + const workspace = Blockly.getMainWorkspace(); + const flyout = workspace && workspace.getFlyout(); + if (workspace && flyout) { + const allBlocks = [...workspace.getAllBlocks(), ...flyout.getWorkspace().getAllBlocks()]; + for (const block of allBlocks) { + if (block.type !== "event_whenkeypressed" && block.type !== "event_whenkeyhit" && block.type !== "sensing_keyoptions") { + continue; + } + const input = block.inputList[0]; + if (!input) { + continue; + } + const field = input.fieldRow.find((i) => i && Array.isArray(i.menuGenerator_)); + if (!field) { + continue; + } + field.menuGenerator_ = appendKeys( + defaultKeys ? [...defaultKeys] : field.menuGenerator_, + block.type === "event_whenkeypressed" || block.type === "event_whenkeyhit" + ); + } + } + }; + + updateExistingBlocks(); + addon.settings.addEventListener("change", updateExistingBlocks); + addon.self.addEventListener("disabled", updateExistingBlocks); + addon.self.addEventListener("reenabled", updateExistingBlocks); +} diff --git a/src/addons/addons/editor-searchable-dropdowns/_manifest_entry.js b/src/addons/addons/editor-searchable-dropdowns/_manifest_entry.js new file mode 100644 index 0000000000000000000000000000000000000000..ecd5e9137afd9f8e0b7ddeed139f6e771c803194 --- /dev/null +++ b/src/addons/addons/editor-searchable-dropdowns/_manifest_entry.js @@ -0,0 +1,29 @@ +/* generated by pull.js */ +const manifest = { + "editorOnly": true, + "name": "Searchable dropdowns", + "description": "Allows you to search block dropdowns.", + "credits": [ + { + "name": "GarboMuffin" + } + ], + "dynamicDisable": true, + "userscripts": [ + { + "url": "userscript.js" + } + ], + "userstyles": [ + { + "url": "userscript.css" + } + ], + "tags": [ + "recommended" + ], + "enabledByDefault": true +}; +import {isMobile} from "../../environment"; +if (isMobile) manifest.enabledByDefault = false; +export default manifest; diff --git a/src/addons/addons/editor-searchable-dropdowns/_runtime_entry.js b/src/addons/addons/editor-searchable-dropdowns/_runtime_entry.js new file mode 100644 index 0000000000000000000000000000000000000000..7d9d3b5487a949dcd0e972e3066ce988a323038d --- /dev/null +++ b/src/addons/addons/editor-searchable-dropdowns/_runtime_entry.js @@ -0,0 +1,7 @@ +/* generated by pull.js */ +import _js from "./userscript.js"; +import _css from "!css-loader!./userscript.css"; +export const resources = { + "userscript.js": _js, + "userscript.css": _css, +}; diff --git a/src/addons/addons/editor-searchable-dropdowns/userscript.css b/src/addons/addons/editor-searchable-dropdowns/userscript.css new file mode 100644 index 0000000000000000000000000000000000000000..ff95a874ad30f13433ed5da9a4e1108f6e8c94b2 --- /dev/null +++ b/src/addons/addons/editor-searchable-dropdowns/userscript.css @@ -0,0 +1,24 @@ +.u-dropdown-searchbar { + width: 100%; + box-sizing: border-box; + /* based on styles for the title input */ + color: white; + background-color: hsla(0, 100%, 100%, 0.25); + border: 1px solid hsla(0, 0%, 0%, 0.15); + padding: 0.5rem; + outline: none; + transition: 0.25s ease-out; + font-size: 13px; + font-weight: bold; + border-radius: 4px; +} +.u-dropdown-searchbar:hover { + background-color: hsla(0, 100%, 100%, 0.5); +} +.u-dropdown-searchbar:focus { + background-color: white; + color: black; +} +.blocklyDropDownDiv .goog-menu { + overflow-x: hidden; +} diff --git a/src/addons/addons/editor-searchable-dropdowns/userscript.js b/src/addons/addons/editor-searchable-dropdowns/userscript.js new file mode 100644 index 0000000000000000000000000000000000000000..652a55c8f580b76d59b2154635e5480699d8ce41 --- /dev/null +++ b/src/addons/addons/editor-searchable-dropdowns/userscript.js @@ -0,0 +1,337 @@ +/* eslint-disable */ +export default async function ({ addon, console, msg }) { + const Blockly = await addon.tab.traps.getBlockly(); + const vm = addon.tab.traps.vm; + + const SCRATCH_ITEMS_TO_HIDE = [ + "RENAME_VARIABLE_ID", + "DELETE_VARIABLE_ID", + "NEW_BROADCAST_MESSAGE_ID", + // From rename-broadcasts addon + "RENAME_BROADCAST_MESSAGE_ID", + ]; + + const canUseAsGlobalVariableName = (name, type) => { + return !vm.runtime.getAllVarNamesOfType(type).includes(name); + }; + + const canUseAsLocalVariableName = (name, type) => { + return !vm.editingTarget.lookupVariableByNameAndType(name, type); + }; + + const ADDON_ITEMS = { + createGlobalVariable: { + enabled: (name) => canUseAsGlobalVariableName(name, ""), + createVariable: (workspace, name) => workspace.createVariable(name), + }, + createLocalVariable: { + enabled: (name) => canUseAsLocalVariableName(name, ""), + createVariable: (workspace, name) => workspace.createVariable(name, "", null, true), + }, + createGlobalList: { + enabled: (name) => canUseAsGlobalVariableName(name, "list"), + createVariable: (workspace, name) => workspace.createVariable(name, "list"), + }, + createLocalList: { + enabled: (name) => canUseAsLocalVariableName(name, "list"), + createVariable: (workspace, name) => workspace.createVariable(name, "list", null, true), + }, + createBroadcast: { + enabled: (name) => canUseAsGlobalVariableName(name, "broadcast_msg"), + createVariable: (workspace, name) => workspace.createVariable(name, "broadcast_msg"), + }, + }; + + let blocklyDropDownContent = null; + let blocklyDropdownMenu = null; + let searchBar = null; + // Contains DOM and addon state + let items = []; + let searchedItems = []; + // Tracks internal Scratch state + let currentDropdownOptions = []; + let resultOfLastGetOptions = []; + + const oldDropDownDivShow = Blockly.DropDownDiv.show; + Blockly.DropDownDiv.show = function (...args) { + blocklyDropdownMenu = document.querySelector(".blocklyDropdownMenu"); + if (!blocklyDropdownMenu) { + return oldDropDownDivShow.call(this, ...args); + } + + blocklyDropdownMenu.focus = () => {}; // no-op focus() so it can't steal it from the search bar + + searchBar = document.createElement("input"); + addon.tab.displayNoneWhileDisabled(searchBar, { display: "flex" }); + searchBar.type = "text"; + searchBar.addEventListener("input", updateSearch); + searchBar.addEventListener("keydown", handleKeyDownEvent); + searchBar.classList.add("u-dropdown-searchbar"); + blocklyDropdownMenu.insertBefore(searchBar, blocklyDropdownMenu.firstChild); + + items = Array.from(blocklyDropdownMenu.children) + .filter((child) => child.tagName !== "INPUT") + .map((element) => ({ + element, + text: element.textContent, + })); + currentDropdownOptions = resultOfLastGetOptions; + updateSearch(); + + // Call the original show method after adding everything so that it can perform the correct size calculations + const ret = oldDropDownDivShow.call(this, ...args); + + // Lock the size of the dropdown + blocklyDropDownContent = Blockly.DropDownDiv.getContentDiv(); + blocklyDropDownContent.style.width = getComputedStyle(blocklyDropDownContent).width; + blocklyDropDownContent.style.height = getComputedStyle(blocklyDropDownContent).height; + + // This is really strange, but if you don't reinsert the search bar into the DOM then focus() doesn't work + blocklyDropdownMenu.insertBefore(searchBar, blocklyDropdownMenu.firstChild); + searchBar.focus(); + + return ret; + }; + + const oldDropDownDivClearContent = Blockly.DropDownDiv.clearContent; + Blockly.DropDownDiv.clearContent = function () { + oldDropDownDivClearContent.call(this); + items = []; + searchedItems = []; + Blockly.DropDownDiv.content_.style.height = ""; + }; + + const oldFieldDropdownGetOptions = Blockly.FieldDropdown.prototype.getOptions; + Blockly.FieldDropdown.prototype.getOptions = function () { + const options = oldFieldDropdownGetOptions.call(this); + const block = this.sourceBlock_; + const isStage = vm.editingTarget && vm.editingTarget.isStage; + if (block) { + if (block.category_ === "data") { + options.push(getMenuItemMessage("createGlobalVariable")); + if (!isStage) { + options.push(getMenuItemMessage("createLocalVariable")); + } + } else if (block.category_ === "data-lists") { + options.push(getMenuItemMessage("createGlobalList")); + if (!isStage) { + options.push(getMenuItemMessage("createLocalList")); + } + } else if (block.type === "event_broadcast_menu" || block.type === "event_whenbroadcastreceived") { + options.push(getMenuItemMessage("createBroadcast")); + } + } + // Options aren't normally stored anywhere, so we'll store them ourselves. + resultOfLastGetOptions = options; + return options; + }; + + const oldFieldTextDropdownGetOptions = Blockly.FieldTextDropdown.prototype.getOptions; + Blockly.FieldTextDropdown.prototype.getOptions = function () { + const options = oldFieldTextDropdownGetOptions.call(this); + const block = this.sourceBlock_; + const isStage = vm.editingTarget && vm.editingTarget.isStage; + if (block) { + if (block.category_ === "data") { + options.push(getMenuItemMessage("createGlobalVariable")); + if (!isStage) { + options.push(getMenuItemMessage("createLocalVariable")); + } + } else if (block.category_ === "data-lists") { + options.push(getMenuItemMessage("createGlobalList")); + if (!isStage) { + options.push(getMenuItemMessage("createLocalList")); + } + } else if (block.type === "event_broadcast_menu" || block.type === "event_whenbroadcastreceived") { + options.push(getMenuItemMessage("createBroadcast")); + } + } + // Options aren't normally stored anywhere, so we'll store them ourselves. + resultOfLastGetOptions = options; + return options; + }; + + const oldFieldVariableOnItemSelected = Blockly.FieldVariable.prototype.onItemSelected; + Blockly.FieldVariable.prototype.onItemSelected = function (menu, menuItem) { + const sourceBlock = this.sourceBlock_; + if (sourceBlock && sourceBlock.workspace && searchBar.value.length !== 0) { + const workspace = sourceBlock.workspace; + const optionId = menuItem.getValue(); + + if (Object.prototype.hasOwnProperty.call(ADDON_ITEMS, optionId)) { + const addonItem = ADDON_ITEMS[optionId]; + Blockly.Events.setGroup(true); + const variable = addonItem.createVariable(workspace, searchBar.value.trim()); + if (this.sourceBlock_) this.setValue(variable.getId()); + Blockly.Events.setGroup(false); + return; + } + } + return oldFieldVariableOnItemSelected.call(this, menu, menuItem); + }; + + function selectItem(item, click) { + // You can't just use click() or focus() because Blockly uses mousedown and mouseup handlers, not click handlers. + item.dispatchEvent(new MouseEvent("mousedown", { relatedTarget: item, bubbles: true })); + if (click) item.dispatchEvent(new MouseEvent("mouseup", { relatedTarget: item, bubbles: true })); + + // Scroll the item into view if it is offscreen. + const itemTop = item.offsetTop; + const itemEnd = itemTop + item.offsetHeight; + + const scrollTop = blocklyDropDownContent.scrollTop; + const scrollHeight = blocklyDropDownContent.offsetHeight; + const scrollEnd = scrollTop + scrollHeight; + + if (scrollTop > itemTop) { + blocklyDropDownContent.scrollTop = itemTop; + } else if (itemEnd > scrollEnd) { + blocklyDropDownContent.scrollTop = itemEnd - scrollHeight; + } + } + + function performSearch() { + const rawQuery = searchBar.value.trim(); + const query = rawQuery.trim().toLowerCase(); + + const rank = (item, index) => { + // Negative number will hide + // Higher numbers will appear first + const option = currentDropdownOptions[index]; + const optionId = option[1]; + if (SCRATCH_ITEMS_TO_HIDE.includes(optionId)) { + return query ? -1 : 0; + } else if (Object.prototype.hasOwnProperty.call(ADDON_ITEMS, optionId)) { + if (!query) { + return -1; + } + const addonInfo = ADDON_ITEMS[optionId]; + if (addonInfo.enabled(rawQuery)) { + item.element.lastChild.lastChild.textContent = getMenuItemMessage(optionId)[0]; + return 0; + } + return -1; + } + const itemText = item.text.toLowerCase(); + if (query === itemText) { + return 2; + } + if (itemText.startsWith(query)) { + return 1; + } + if (itemText.includes(query)) { + return 0; + } + return -1; + }; + return items + .map((item, index) => ({ + item, + score: rank(item, index), + })) + .sort(({ score: scoreA }, { score: scoreB }) => Math.max(0, scoreB) - Math.max(0, scoreA)); + } + + function updateSearch() { + const previousSearchedItems = searchedItems; + searchedItems = performSearch(); + let needToUpdateDOM = previousSearchedItems.length !== searchedItems.length; + if (!needToUpdateDOM) { + for (let i = 0; i < searchedItems.length; i++) { + if (searchedItems[i].item !== previousSearchedItems[i].item) { + needToUpdateDOM = true; + break; + } + } + } + if (needToUpdateDOM && previousSearchedItems.length > 0) { + for (const { item } of previousSearchedItems) { + item.element.remove(); + } + for (const { item } of searchedItems) { + blocklyDropdownMenu.appendChild(item.element); + } + } + for (const { item, score } of searchedItems) { + item.element.hidden = score < 0; + } + } + + function handleKeyDownEvent(event) { + if (event.key === "Enter") { + // Reimplement enter to select item to account for hidden items and default to the top item. + event.stopPropagation(); + event.preventDefault(); + + const selectedItem = document.querySelector(".goog-menuitem-highlight"); + if (selectedItem && !selectedItem.hidden) { + selectItem(selectedItem, true); + return; + } + + const selectedBlock = Blockly.selected; + if (searchBar.value === "" && selectedBlock) { + if ( + selectedBlock.type === "event_broadcast" || + selectedBlock.type === "event_broadcastandwait" || + selectedBlock.type === "event_whenbroadcastreceived" + ) { + // The top item of these dropdowns is always "New message" + // When pressing enter on an empty search bar, we close the dropdown instead of making a new broadcast. + Blockly.DropDownDiv.hide(); + return; + } + } + for (const { item } of searchedItems) { + if (!item.element.hidden) { + selectItem(item.element, true); + break; + } + } + // If there is no top value, do nothing and leave the dropdown open + } else if (event.key === "Escape") { + Blockly.DropDownDiv.hide(); + } else if (event.key === "ArrowDown" || event.key === "ArrowUp") { + // Reimplement keyboard navigation to account for hidden items. + event.preventDefault(); + event.stopPropagation(); + + const items = searchedItems.filter((i) => i.score >= 0).map((i) => i.item); + if (items.length === 0) { + return; + } + + let selectedIndex = -1; + for (let i = 0; i < items.length; i++) { + if (items[i].element.classList.contains("goog-menuitem-highlight")) { + selectedIndex = i; + break; + } + } + + const lastIndex = items.length - 1; + let newIndex = 0; + if (event.key === "ArrowDown") { + if (selectedIndex === -1 || selectedIndex === lastIndex) { + newIndex = 0; + } else { + newIndex = selectedIndex + 1; + } + } else { + if (selectedIndex === -1 || selectedIndex === 0) { + newIndex = lastIndex; + } else { + newIndex = selectedIndex - 1; + } + } + + selectItem(items[newIndex].element, false); + } + } + + function getMenuItemMessage(message) { + // Format used internally by Scratch: + // [human readable name, internal name] + return [msg(message, { name: searchBar?.value.trim() || "" }), message]; + } +} diff --git a/src/addons/addons/editor-sounds/_manifest_entry.js b/src/addons/addons/editor-sounds/_manifest_entry.js new file mode 100644 index 0000000000000000000000000000000000000000..3ce15bb0d951fb658409558afce333cda09c17cc --- /dev/null +++ b/src/addons/addons/editor-sounds/_manifest_entry.js @@ -0,0 +1,21 @@ +/* generated by pull.js */ +const manifest = { + "editorOnly": true, + "noTranslations": true, + "name": "Editor sound effects", + "description": "Plays sound effects when you connect or delete blocks.", + "credits": [ + { + "name": "GarboMuffin" + } + ], + "dynamicDisable": true, + "userscripts": [ + { + "url": "userscript.js" + } + ], + "tags": [], + "enabledByDefault": false +}; +export default manifest; diff --git a/src/addons/addons/editor-sounds/_runtime_entry.js b/src/addons/addons/editor-sounds/_runtime_entry.js new file mode 100644 index 0000000000000000000000000000000000000000..bc67131957e52185c142f348760610cfaa4f774d --- /dev/null +++ b/src/addons/addons/editor-sounds/_runtime_entry.js @@ -0,0 +1,5 @@ +/* generated by pull.js */ +import _js from "./userscript.js"; +export const resources = { + "userscript.js": _js, +}; diff --git a/src/addons/addons/editor-sounds/userscript.js b/src/addons/addons/editor-sounds/userscript.js new file mode 100644 index 0000000000000000000000000000000000000000..50757bf3c1845b152b90ba6e9d7dc030fcbe5454 --- /dev/null +++ b/src/addons/addons/editor-sounds/userscript.js @@ -0,0 +1,27 @@ +export default async function ({ addon, console }) { + const ScratchBlocks = await addon.tab.traps.getBlockly(); + const injectCurrent = () => { + const workspace = Blockly.getMainWorkspace(); + const pathToMedia = workspace.options.pathToMedia; + ScratchBlocks.inject.loadSounds_(pathToMedia, workspace); + }; + + // Add sounds to the current workspace + injectCurrent(); + + // Add sounds to all future workspaces + const originalInit = ScratchBlocks.init_; + ScratchBlocks.init_ = function (...args) { + const wksp = args[0]; + wksp.options.hasSounds = true; + return originalInit.call(this, ...args); + }; + + addon.self.addEventListener("disabled", () => { + const workspace = Blockly.getMainWorkspace(); + const audio = workspace.getAudioManager(); + delete audio.SOUNDS_.click; + delete audio.SOUNDS_.delete; + }); + addon.self.addEventListener("reenabled", injectCurrent); +} diff --git a/src/addons/addons/editor-stage-left/_manifest_entry.js b/src/addons/addons/editor-stage-left/_manifest_entry.js new file mode 100644 index 0000000000000000000000000000000000000000..c56b0a4f06f75eff48897a076f2d6bce01567a77 --- /dev/null +++ b/src/addons/addons/editor-stage-left/_manifest_entry.js @@ -0,0 +1,33 @@ +/* generated by pull.js */ +const manifest = { + "noTranslations": true, + "name": "Display stage on left side", + "description": "Moves the stage to the left side of the editor, like in Scratch 2.0.", + "info": [ + { + "id": "reverseOrder", + "text": "To change the position of buttons above the stage, use the \"reverse order of project controls\" addon." + } + ], + "credits": [ + { + "name": "NitroCipher/ZenithRogue" + } + ], + "userscripts": [ + { + "url": "fix-share-the-love.js" + } + ], + "dynamicDisable": true, + "userstyles": [ + { + "url": "stageleft.css" + } + ], + "tags": [ + "theme" + ], + "enabledByDefault": false +}; +export default manifest; diff --git a/src/addons/addons/editor-stage-left/_runtime_entry.js b/src/addons/addons/editor-stage-left/_runtime_entry.js new file mode 100644 index 0000000000000000000000000000000000000000..1cf6ee03c289739cd570cf760396363edf5c72bd --- /dev/null +++ b/src/addons/addons/editor-stage-left/_runtime_entry.js @@ -0,0 +1,7 @@ +/* generated by pull.js */ +import _js from "./fix-share-the-love.js"; +import _css from "!css-loader!./stageleft.css"; +export const resources = { + "fix-share-the-love.js": _js, + "stageleft.css": _css, +}; diff --git a/src/addons/addons/editor-stage-left/fix-share-the-love.js b/src/addons/addons/editor-stage-left/fix-share-the-love.js new file mode 100644 index 0000000000000000000000000000000000000000..73b0c65a0d1ad76e52ea253eea751e5231c34048 --- /dev/null +++ b/src/addons/addons/editor-stage-left/fix-share-the-love.js @@ -0,0 +1,21 @@ +export default async function ({ addon, console }) { + const ScratchBlocks = await addon.tab.traps.getBlockly(); + const resize = () => { + const workspace = Blockly.getMainWorkspace(); + if (workspace) window.dispatchEvent(new Event("resize")); + }; + addon.self.addEventListener("disabled", resize); + addon.self.addEventListener("reenabled", resize); + const originalGetClientRect = ScratchBlocks.VerticalFlyout.prototype.getClientRect; + ScratchBlocks.VerticalFlyout.prototype.getClientRect = function () { + const rect = originalGetClientRect.call(this); + if (!rect || addon.self.disabled) return rect; + // undo the effect of BIG_NUM in https://github.com/LLK/scratch-blocks/blob/ab26fa2960643fa38fbc7b91ca2956be66055070/core/flyout_vertical.js#L739 + if (this.toolboxPosition_ === ScratchBlocks.TOOLBOX_AT_LEFT) { + rect.left += 1000000000; + } + rect.width -= 1000000000; + return rect; + }; + resize(); +} diff --git a/src/addons/addons/editor-stage-left/stageleft.css b/src/addons/addons/editor-stage-left/stageleft.css new file mode 100644 index 0000000000000000000000000000000000000000..22efa808131a3984c74d143818a05f7bbe52166f --- /dev/null +++ b/src/addons/addons/editor-stage-left/stageleft.css @@ -0,0 +1,80 @@ +[dir="ltr"] [class^="stage-header_stage-size-toggle-group"] [class^="stage-header_stage-button-icon"] { + transform: scaleX(-1); +} +[dir="rtl"] [class^="stage-header_stage-size-toggle-group"] [class^="stage-header_stage-button-icon"] { + transform: none; +} +[class^="target-pane_target-pane"] { + flex-direction: row-reverse; +} +[dir="ltr"] [class^="target-pane_stage-selector-wrapper"] { + margin-left: 0; + margin-right: calc(0.5rem / 2); +} +[dir="ltr"] [class^="sprite-selector_sprite-selector"] { + margin-left: calc(0.5rem / 2); + margin-right: 0; +} +[dir="rtl"] [class^="target-pane_stage-selector-wrapper"] { + margin-right: 0; + margin-left: calc(0.5rem / 2); +} +[dir="rtl"] [class^="sprite-selector_sprite-selector"] { + margin-right: calc(0.5rem / 2); + margin-left: 0; +} +[class^="gui_flex-wrapper"] { + flex-direction: row-reverse; + overflow-x: hidden; +} + +[dir="ltr"] [class^="backpack_backpack-header"] { + border-top-right-radius: 0; + border-top-left-radius: 0.5rem; +} +[dir="ltr"] [class^="blocks_blocks_C530M"] .injectionDiv, +[dir="ltr"] [class^="asset-panel_wrapper"] { + border-top-right-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0.5rem; +} +[dir="ltr"] [class^="gui_extension-button-container"] { + border-bottom-left-radius: 0.5rem; +} + +[dir="rtl"] [class^="backpack_backpack-header"] { + border-top-left-radius: 0; + border-top-right-radius: 0.5rem; +} +[dir="rtl"] [class^="blocks_blocks_C530M"] .injectionDiv, +[dir="rtl"] [class^="asset-panel_wrapper"] { + border-top-left-radius: 0; + border-bottom-left-radius: 0; + border-bottom-right-radius: 0.5rem; +} +[dir="rtl"] [class^="gui_extension-button-container"] { + border-bottom-right-radius: 0.5rem; +} + +.Popover { + /* See hide-flyout */ + z-index: 51; +} + +/* hide-stage compatibility */ + +.sa-stage-hidden [class*="stage-header_stage-size-row"] { + right: auto; + left: 0.5rem; + width: calc(240px + 0.125rem); + justify-content: flex-end; +} + +[dir="rtl"] .sa-stage-hidden [class*="stage-header_stage-size-row"] { + left: auto; + right: 0.5rem; +} + +.sa-stage-hidden [class*="gui_tab-list_"] { + padding-inline-start: calc(240px + 1.125rem); +} diff --git a/src/addons/addons/editor-stepping/_manifest_entry.js b/src/addons/addons/editor-stepping/_manifest_entry.js new file mode 100644 index 0000000000000000000000000000000000000000..535deff696b4a25b1561cd180f93015ba379ad57 --- /dev/null +++ b/src/addons/addons/editor-stepping/_manifest_entry.js @@ -0,0 +1,26 @@ +/* generated by pull.js */ +const manifest = { + "editorOnly": true, + "noTranslations": true, + "noCompiler": true, + "name": "Running block border", + "description": "Adds a colored highlight to the blocks that are currently being executed in a project.", + "dynamicDisable": true, + "userscripts": [ + { + "url": "userscript.js" + } + ], + "settings": [ + { + "dynamic": true, + "name": "Highlight color", + "id": "highlight-color", + "type": "color", + "default": "#0000ff" + } + ], + "tags": [], + "enabledByDefault": false +}; +export default manifest; diff --git a/src/addons/addons/editor-stepping/_runtime_entry.js b/src/addons/addons/editor-stepping/_runtime_entry.js new file mode 100644 index 0000000000000000000000000000000000000000..bc67131957e52185c142f348760610cfaa4f774d --- /dev/null +++ b/src/addons/addons/editor-stepping/_runtime_entry.js @@ -0,0 +1,5 @@ +/* generated by pull.js */ +import _js from "./userscript.js"; +export const resources = { + "userscript.js": _js, +}; diff --git a/src/addons/addons/editor-stepping/highlighter.js b/src/addons/addons/editor-stepping/highlighter.js new file mode 100644 index 0000000000000000000000000000000000000000..15d75e69fe3139634a9ae8910009116d4edaaa82 --- /dev/null +++ b/src/addons/addons/editor-stepping/highlighter.js @@ -0,0 +1,146 @@ +const SVG_NS = "http://www.w3.org/2000/svg"; + +const containerSvg = document.createElementNS(SVG_NS, "svg"); +// unfortunately we can't use display: none on this as that breaks filters +containerSvg.style.position = "fixed"; +containerSvg.style.top = "-999999px"; +containerSvg.style.width = "0"; +containerSvg.style.height = "0"; +document.body.appendChild(containerSvg); + +let nextGlowerId = 0; + +const highlightsPerElement = new WeakMap(); + +const getHighlightersForElement = (element) => { + if (!highlightsPerElement.get(element)) { + highlightsPerElement.set(element, new Set()); + } + return highlightsPerElement.get(element); +}; + +const updateHighlight = (element, highlighters) => { + let result; + for (const i of highlighters) { + if (!result || i.priority > result.priority) { + result = i; + } + } + if (result) { + element.style.filter = result.filter; + } else { + element.style.filter = ""; + } +}; + +const addHighlight = (element, highlighter) => { + const highlighters = getHighlightersForElement(element); + highlighters.add(highlighter); + updateHighlight(element, highlighters); +}; + +const removeHighlight = (element, highlighter) => { + const highlighters = getHighlightersForElement(element); + highlighters.delete(highlighter); + updateHighlight(element, highlighters); +}; + +class Highlighter { + constructor(priority, color) { + this.priority = priority; + + const id = `sa_glower_filter${nextGlowerId++}`; + this.filter = `url("#${id}")`; + + this.previousElements = new Set(); + + const filterElement = document.createElementNS(SVG_NS, "filter"); + filterElement.id = id; + filterElement.setAttribute("width", "180%"); + filterElement.setAttribute("height", "160%"); + filterElement.setAttribute("x", "-40%"); + filterElement.setAttribute("y", "-30%"); + + const filterBlur = document.createElementNS(SVG_NS, "feGaussianBlur"); + filterBlur.setAttribute("in", "SourceGraphic"); + filterBlur.setAttribute("stdDeviation", "4"); + filterElement.appendChild(filterBlur); + + const filterTransfer = document.createElementNS(SVG_NS, "feComponentTransfer"); + filterTransfer.setAttribute("result", "outBlur"); + filterElement.appendChild(filterTransfer); + + const filterTransferTable = document.createElementNS(SVG_NS, "feFuncA"); + filterTransferTable.setAttribute("type", "table"); + filterTransferTable.setAttribute("tableValues", "0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1"); + filterTransfer.appendChild(filterTransferTable); + + const filterFlood = document.createElementNS(SVG_NS, "feFlood"); + filterFlood.setAttribute("flood-opacity", "1"); + filterFlood.setAttribute("result", "outColor"); + filterElement.appendChild(filterFlood); + this.filterFlood = filterFlood; + + const filterComposite = document.createElementNS(SVG_NS, "feComposite"); + filterComposite.setAttribute("in", "outColor"); + filterComposite.setAttribute("in2", "outBlur"); + filterComposite.setAttribute("operator", "in"); + filterComposite.setAttribute("result", "outGlow"); + filterElement.appendChild(filterComposite); + + const filterFinalComposite = document.createElementNS(SVG_NS, "feComposite"); + filterFinalComposite.setAttribute("in", "SourceGraphic"); + filterFinalComposite.setAttribute("in2", "outGlow"); + filterFinalComposite.setAttribute("operator", "over"); + filterElement.appendChild(filterFinalComposite); + + containerSvg.appendChild(filterElement); + this.setColor(color); + } + + setColor(color) { + this.filterFlood.setAttribute("flood-color", color); + } + + setGlowingThreads(threads) { + const elementsToHighlight = new Set(); + const workspace = Blockly.getMainWorkspace(); + + if (workspace) { + for (const thread of threads) { + thread.stack.forEach((blockId) => { + const block = workspace.getBlockById(blockId); + if (!block) { + return; + } + const childblock = thread.stack.find((i) => { + let b = block; + while (b.childBlocks_.length) { + b = b.childBlocks_[b.childBlocks_.length - 1]; + if (i === b.id) return true; + } + return false; + }); + if (!childblock && block.svgPath_) { + const svgPath = block.svgPath_; + elementsToHighlight.add(svgPath); + } + }); + } + } + + for (const element of this.previousElements) { + if (!elementsToHighlight.has(element)) { + removeHighlight(element, this); + } + } + for (const element of elementsToHighlight) { + if (!this.previousElements.has(element)) { + addHighlight(element, this); + } + } + this.previousElements = elementsToHighlight; + } +} + +export default Highlighter; diff --git a/src/addons/addons/editor-stepping/userscript.js b/src/addons/addons/editor-stepping/userscript.js new file mode 100644 index 0000000000000000000000000000000000000000..d118dfb3aa565a3a05075244936e29e213d8def4 --- /dev/null +++ b/src/addons/addons/editor-stepping/userscript.js @@ -0,0 +1,27 @@ +import { getRunningThread } from "../debugger/module.js"; +import Highlighter from "./highlighter.js"; + +export default async function ({ addon, console }) { + const vm = addon.tab.traps.vm; + + const highlighter = new Highlighter(0, addon.settings.get("highlight-color")); + addon.settings.addEventListener("change", () => { + highlighter.setColor(addon.settings.get("highlight-color")); + }); + + addon.self.addEventListener("disabled", () => { + highlighter.setGlowingThreads([]); + }); + + const oldStep = vm.runtime._step; + vm.runtime._step = function (...args) { + oldStep.call(this, ...args); + if (!addon.self.disabled) { + const runningThread = getRunningThread(); + const threads = vm.runtime.threads.filter( + (thread) => thread !== runningThread && !thread.target.blocks.forceNoGlow && !thread.isCompiled + ); + highlighter.setGlowingThreads(threads); + } + }; +} diff --git a/src/addons/addons/editor-theme3/_manifest_entry.js b/src/addons/addons/editor-theme3/_manifest_entry.js new file mode 100644 index 0000000000000000000000000000000000000000..589cb9900340c9ba7291819e8b6b95bc119f9a50 --- /dev/null +++ b/src/addons/addons/editor-theme3/_manifest_entry.js @@ -0,0 +1,396 @@ +/* generated by pull.js */ +const manifest = { + "editorOnly": true, + "noTranslations": true, + "name": "Customizable block colors", + "description": "Edit block colors for each category in the editor.", + "credits": [ + { + "name": "NitroCipher/ZenithRogue" + }, + { + "name": "TheColaber", + "link": "https://scratch.mit.edu/users/TheColaber/" + } + ], + "customCssVariables": [ + { + "name": "inputColor-text", + "value": { + "type": "alphaThreshold", + "source": { + "type": "settingValue", + "settingId": "input-color" + }, + "opaque": { + "type": "textColor", + "source": { + "type": "settingValue", + "settingId": "input-color" + } + }, + "transparent": { + "type": "map", + "source": { + "type": "settingValue", + "settingId": "text" + }, + "options": { + "white": "#ffffff", + "black": "#575e75", + "colorOnWhite": "#575e75", + "colorOnBlack": "#ffffff" + } + } + } + }, + { + "name": "inputColor-blackText", + "value": { + "type": "alphaThreshold", + "source": { + "type": "settingValue", + "settingId": "input-color" + }, + "opaque": { + "type": "textColor", + "black": "#000000", + "source": { + "type": "settingValue", + "settingId": "input-color" + } + }, + "transparent": { + "type": "map", + "source": { + "type": "settingValue", + "settingId": "text" + }, + "options": { + "white": "#ffffff", + "black": "#000000", + "colorOnWhite": "#000000", + "colorOnBlack": "#ffffff" + } + } + } + }, + { + "name": "commentText", + "value": { + "type": "textColor", + "source": { + "type": "settingValue", + "settingId": "comment-color" + } + } + }, + { + "name": "commentTextTransparent", + "value": { + "type": "textColor", + "black": "rgba(0, 0, 0, 0.50)", + "white": "rgba(255, 255, 255, 0.50)", + "source": { + "type": "settingValue", + "settingId": "comment-color" + } + } + }, + { + "name": "commentBorder", + "value": { + "type": "multiply", + "source": { + "type": "settingValue", + "settingId": "comment-color" + }, + "r": 0.7, + "g": 0.7, + "b": 0.7 + } + } + ], + "dynamicDisable": true, + "userscripts": [ + { + "url": "theme3.js" + } + ], + "userstyles": [ + { + "url": "theme3.css" + }, + { + "url": "black_text.css", + "if": { + "settings": { + "text": "black" + } + } + }, + { + "url": "color_on_white.css", + "if": { + "settings": { + "text": "colorOnWhite" + } + } + }, + { + "url": "color_on_black.css", + "if": { + "settings": { + "text": "colorOnBlack" + } + } + } + ], + "settings": [ + { + "dynamic": true, + "name": "motion", + "id": "motion-color", + "type": "color", + "default": "#4C97FF", + "allowTransparency": true + }, + { + "dynamic": true, + "name": "looks", + "id": "looks-color", + "type": "color", + "default": "#9966FF", + "allowTransparency": true + }, + { + "dynamic": true, + "name": "sounds", + "id": "sounds-color", + "type": "color", + "default": "#CF63CF", + "allowTransparency": true + }, + { + "dynamic": true, + "name": "events", + "id": "events-color", + "type": "color", + "default": "#FFBF00", + "allowTransparency": true + }, + { + "dynamic": true, + "name": "control", + "id": "control-color", + "type": "color", + "default": "#FFAB19", + "allowTransparency": true + }, + { + "dynamic": true, + "name": "sensing", + "id": "sensing-color", + "type": "color", + "default": "#5CB1D6", + "allowTransparency": true + }, + { + "dynamic": true, + "name": "operators", + "id": "operators-color", + "type": "color", + "default": "#59C059", + "allowTransparency": true + }, + { + "dynamic": true, + "name": "variables", + "id": "data-color", + "type": "color", + "default": "#FF8C1A", + "allowTransparency": true + }, + { + "dynamic": true, + "name": "lists", + "id": "data-lists-color", + "type": "color", + "default": "#FF661A", + "allowTransparency": true + }, + { + "dynamic": true, + "name": "custom", + "id": "custom-color", + "type": "color", + "default": "#FF6680", + "allowTransparency": true + }, + { + "dynamic": true, + "name": "extensions", + "id": "Pen-color", + "type": "color", + "default": "#0FBD8C", + "allowTransparency": true + }, + { + "dynamic": true, + "name": "TurboWarp", + "id": "tw-color", + "type": "color", + "default": "#ff4c4c", + "allowTransparency": true + }, + { + "dynamic": true, + "name": "Addon blocks", + "id": "sa-color", + "type": "color", + "default": "#29BEB8", + "allowTransparency": true, + "if": { + "addonEnabled": [ + "debugger" + ] + } + }, + { + "dynamic": true, + "name": "Block inputs", + "id": "input-color", + "type": "color", + "default": "#FFFFFF", + "allowTransparency": true + }, + { + "dynamic": true, + "name": "Comments", + "id": "comment-color", + "type": "color", + "default": "#FEF49C" + }, + { + "dynamic": true, + "name": "Text color", + "id": "text", + "type": "select", + "default": "white", + "potentialValues": [ + { + "id": "white", + "name": "White" + }, + { + "id": "black", + "name": "Black" + }, + { + "id": "colorOnWhite", + "name": "Colored on white background" + }, + { + "id": "colorOnBlack", + "name": "Colored on black background" + } + ] + } + ], + "tags": [ + "theme" + ], + "enabledByDefault": false, + "presets": [ + { + "name": "3.0 Tweaks", + "id": "tweaks", + "description": "Events, Control, and Custom blocks with 2.0 inspired colors", + "values": { + "motion-color": "#4C97FF", + "looks-color": "#9966FF", + "sounds-color": "#CF63CF", + "events-color": "#DE9E2E", + "control-color": "#FFBF00", + "sensing-color": "#5CB1D6", + "operators-color": "#59C059", + "data-color": "#FF8C1A", + "data-lists-color": "#FF661A", + "custom-color": "#5f49d8", + "Pen-color": "#0FBD8C", + "sa-color": "#29BEB8", + "comment-color": "#FEF49C", + "input-color": "#FFFFFF", + "text": "white" + } + }, + { + "name": "2.0 Colors", + "id": "original", + "description": "The original block colors from Scratch 2.0", + "values": { + "motion-color": "#4a6cd4", + "looks-color": "#8a55d7", + "sounds-color": "#bb42c3", + "events-color": "#c88330", + "control-color": "#e1a91a", + "sensing-color": "#2ca5e2", + "operators-color": "#5cb712", + "data-color": "#ee7d16", + "data-lists-color": "#cc5b22", + "custom-color": "#632d99", + "Pen-color": "#0e9a6c", + "sa-color": "#29beb8", + "comment-color": "#FFFFD2", + "input-color": "#ffffff", + "text": "white" + } + }, + { + "name": "Dark", + "id": "dark", + "description": "Dark versions of the default colors", + "values": { + "motion-color": "#004099", + "looks-color": "#220066", + "sounds-color": "#752475", + "events-color": "#997300", + "control-color": "#664100", + "sensing-color": "#1f5f7a", + "operators-color": "#235c23", + "data-color": "#b35900", + "data-lists-color": "#993300", + "custom-color": "#99004d", + "Pen-color": "#064734", + "tw-color": "#660000", + "sa-color": "#166966", + "comment-color": "#423f24", + "input-color": "#202020", + "text": "white" + } + }, + { + "name": "Black", + "id": "black", + "description": "Makes block backgrounds black", + "values": { + "motion-color": "#4C97FF", + "looks-color": "#9966FF", + "sounds-color": "#CF63CF", + "events-color": "#FFBF00", + "control-color": "#FFAB19", + "sensing-color": "#5CB1D6", + "operators-color": "#59C059", + "data-color": "#FF8C1A", + "data-lists-color": "#FF661A", + "custom-color": "#FF6680", + "Pen-color": "#0FBD8C", + "sa-color": "#29BEB8", + "comment-color": "#FEF49C", + "input-color": "#202020", + "text": "colorOnBlack" + } + } + ] +}; +export default manifest; diff --git a/src/addons/addons/editor-theme3/_runtime_entry.js b/src/addons/addons/editor-theme3/_runtime_entry.js new file mode 100644 index 0000000000000000000000000000000000000000..6e6ee7718109c2f9cf38bb5ad01a0f3e7b2a928e --- /dev/null +++ b/src/addons/addons/editor-theme3/_runtime_entry.js @@ -0,0 +1,13 @@ +/* generated by pull.js */ +import _js from "./theme3.js"; +import _css from "!css-loader!./theme3.css"; +import _css2 from "!css-loader!./black_text.css"; +import _css3 from "!css-loader!./color_on_white.css"; +import _css4 from "!css-loader!./color_on_black.css"; +export const resources = { + "theme3.js": _js, + "theme3.css": _css, + "black_text.css": _css2, + "color_on_white.css": _css3, + "color_on_black.css": _css4, +}; diff --git a/src/addons/addons/editor-theme3/black_text.css b/src/addons/addons/editor-theme3/black_text.css new file mode 100644 index 0000000000000000000000000000000000000000..9be63aba2cee999f172ca53854c0b8236d6370aa --- /dev/null +++ b/src/addons/addons/editor-theme3/black_text.css @@ -0,0 +1,36 @@ +@namespace xlink url("http://www.w3.org/1999/xlink"); + +.scratchCategoryItemBubble::after { + /* block-palette-icons */ + filter: brightness(0); +} + +.blocklyEditableText > text { + fill: var(--editorTheme3-inputColor-blackText); +} +.blocklyHtmlInput { + color: var(--editorTheme3-inputColor-blackText); +} + +[class*="blocks_blocks_"] image[xlink|href$="/rotate-left.svg"], +[class*="blocks_blocks_"] image[xlink|href$="/rotate-right.svg"], +[class*="blocks_blocks_"] image[xlink|href$="/repeat.svg"] { + filter: invert(1) hue-rotate(180deg); +} + +.blocklyDropDownDiv .goog-menuitem, +.sa-contextmenu-colored .blocklyContextMenu .goog-menuitem .goog-menuitem-content { + color: black; +} +.blocklyDropDownDiv .blocklyText { + fill: black; +} + +/* Compatibility */ + +.sa-block-color { + --sa-block-text: black; + --sa-block-gray-text: black; + --sa-block-colored-text: var(--sa-block-background-tertiary); + --sa-block-text-on-bright-background: black; +} diff --git a/src/addons/addons/editor-theme3/color_on_black.css b/src/addons/addons/editor-theme3/color_on_black.css new file mode 100644 index 0000000000000000000000000000000000000000..1447f611f526748ee06d53390bf842988f659209 --- /dev/null +++ b/src/addons/addons/editor-theme3/color_on_black.css @@ -0,0 +1,39 @@ +.u-dropdown-searchbar { + border-color: rgba(255, 255, 255, 0.15); +} +.u-dropdown-searchbar:focus { + background-color: var(--editorTheme3-hoveredItem); +} +.blocklyDropDownDiv .goog-menuitem-checkbox { + filter: brightness(0) invert(1); +} + +.scratchCommentRect { + fill: #282828; +} +.scratchCommentBody, +.scratchCommentTextarea { + background-color: #282828; +} +.scratchWorkspaceCommentBorder { + stroke: var(--editorTheme3-commentColor); +} +.scratchCommentTextarea::placeholder { + color: rgba(255, 255, 255, 0.5); +} +.scratchCommentText { + fill: #ffffff; + color: #ffffff; +} + +/* Compatibility */ + +.sa-block-color { + --sa-block-colored-background: var(--sa-block-background-secondary); + --sa-block-colored-background-secondary: var(--sa-block-field-background); + --sa-block-bright-background: var(--sa-block-background-tertiary); + --sa-block-text: var(--sa-block-background-tertiary); + --sa-block-gray-text: white; + --sa-block-colored-text: var(--sa-block-background-tertiary); + --sa-block-text-on-bright-background: white; +} diff --git a/src/addons/addons/editor-theme3/color_on_white.css b/src/addons/addons/editor-theme3/color_on_white.css new file mode 100644 index 0000000000000000000000000000000000000000..2a46948b7d69fa10a3906f353230298936b9efb2 --- /dev/null +++ b/src/addons/addons/editor-theme3/color_on_white.css @@ -0,0 +1,51 @@ +.scratchCategoryItemBubble::after { + /* block-palette-icons */ + filter: brightness(0); + opacity: 0.6; +} + +.u-dropdown-searchbar, +.u-dropdown-searchbar:focus, +.blocklyDropDownDiv .goog-menuitem, +.sa-contextmenu-colored .blocklyContextMenu .goog-menuitem .goog-menuitem-content { + color: #575e75; +} +.u-dropdown-searchbar:focus { + background-color: var(--editorTheme3-hoveredItem); +} + +.blocklyAngleDragHandle { + stroke: black; + stroke-opacity: 0.15; + paint-order: stroke fill; +} + +.scratchCommentRect { + fill: #feffff; +} +.scratchCommentBody, +.scratchCommentTextarea { + background-color: #ffffff; +} +.scratchWorkspaceCommentBorder { + stroke: var(--editorTheme3-commentColor); +} +.scratchCommentTextarea::placeholder { + color: rgba(0, 0, 0, 0.5); +} +.scratchCommentText { + fill: #575e75; + color: #575e75; +} + +/* Compatibility */ + +.sa-block-color { + --sa-block-colored-background: var(--sa-block-background-secondary); + --sa-block-colored-background-secondary: var(--sa-block-field-background); + --sa-block-bright-background: var(--sa-block-background-tertiary); + --sa-block-text: var(--sa-block-background-tertiary); + --sa-block-gray-text: #575e75; + --sa-block-colored-text: var(--sa-block-background-tertiary); + --sa-block-text-on-bright-background: white; +} diff --git a/src/addons/addons/editor-theme3/compatibility.css b/src/addons/addons/editor-theme3/compatibility.css new file mode 100644 index 0000000000000000000000000000000000000000..b619c720dfa577fd3e209439f06a01237f64f845 --- /dev/null +++ b/src/addons/addons/editor-theme3/compatibility.css @@ -0,0 +1,104 @@ +/* Imported by other addons */ + +.sa-block-color { + --sa-block-colored-background: var(--sa-block-background-primary); + --sa-block-colored-background-secondary: var(--sa-block-field-background); + --sa-block-bright-background: var(--sa-block-background-primary); + --sa-block-text: white; + --sa-block-gray-text: white; + --sa-block-colored-text: var(--sa-block-background-primary); + --sa-block-text-on-bright-background: white; +} + +.sa-block-color-motion { + --sa-block-background-primary: var(--editorTheme3-motion-primary, #4c97ff); + --sa-block-background-secondary: var(--editorTheme3-motion-secondary, #4280d7); + --sa-block-background-tertiary: var(--editorTheme3-motion-tertiary, #3373cc); + --sa-block-field-background: var(--editorTheme3-motion-field, #3373cc); +} + +.sa-block-color-looks { + --sa-block-background-primary: var(--editorTheme3-looks-primary, #9966ff); + --sa-block-background-secondary: var(--editorTheme3-looks-secondary, #855cd6); + --sa-block-background-tertiary: var(--editorTheme3-looks-tertiary, #774dcb); + --sa-block-field-background: var(--editorTheme3-looks-field, #774dcb); +} + +.sa-block-color-sounds { + --sa-block-background-primary: var(--editorTheme3-sounds-primary, #cf63cf); + --sa-block-background-secondary: var(--editorTheme3-sounds-secondary, #c94fc9); + --sa-block-background-tertiary: var(--editorTheme3-sounds-tertiary, #bd42bd); + --sa-block-field-background: var(--editorTheme3-sounds-field, #bd42bd); +} + +.sa-block-color-events { + --sa-block-background-primary: var(--editorTheme3-event-primary, #ffbf00); + --sa-block-background-secondary: var(--editorTheme3-event-secondary, #e6ac00); + --sa-block-background-tertiary: var(--editorTheme3-event-tertiary, #cc9900); + --sa-block-field-background: var(--editorTheme3-event-field, #cc9900); +} + +.sa-block-color-control { + --sa-block-background-primary: var(--editorTheme3-control-primary, #ffab19); + --sa-block-background-secondary: var(--editorTheme3-control-secondary, #ec9c13); + --sa-block-background-tertiary: var(--editorTheme3-control-tertiary, #cf8b17); + --sa-block-field-background: var(--editorTheme3-control-field, #cf8b17); +} + +.sa-block-color-sensing { + --sa-block-background-primary: var(--editorTheme3-sensing-primary, #5cb1d6); + --sa-block-background-secondary: var(--editorTheme3-sensing-secondary, #47a8d1); + --sa-block-background-tertiary: var(--editorTheme3-sensing-tertiary, #2e8eb8); + --sa-block-field-background: var(--editorTheme3-sensing-field, #2e8eb8); +} + +.sa-block-color-operators { + --sa-block-background-primary: var(--editorTheme3-operators-primary, #59c059); + --sa-block-background-secondary: var(--editorTheme3-operators-secondary, #46b946); + --sa-block-background-tertiary: var(--editorTheme3-operators-tertiary, #389438); + --sa-block-field-background: var(--editorTheme3-operators-field, #389438); +} + +.sa-block-color-data { + --sa-block-background-primary: var(--editorTheme3-data-primary, #ff8c1a); + --sa-block-background-secondary: var(--editorTheme3-data-secondary, #ff8000); + --sa-block-background-tertiary: var(--editorTheme3-data-tertiary, #db6e00); + --sa-block-field-background: var(--editorTheme3-data-field, #db6e00); +} + +.sa-block-color-data-lists, +.sa-block-color-list { + --sa-block-background-primary: var(--editorTheme3-data_lists-primary, #ff661a); + --sa-block-background-secondary: var(--editorTheme3-data_lists-secondary, #ff5500); + --sa-block-background-tertiary: var(--editorTheme3-data_lists-tertiary, #e64d00); + --sa-block-field-background: var(--editorTheme3-data_lists-field, #e64d00); +} + +.sa-block-color-more, +.sa-block-color-null { + --sa-block-background-primary: var(--editorTheme3-more-primary, #ff6680); + --sa-block-background-secondary: var(--editorTheme3-more-secondary, #ff4d6a); + --sa-block-background-tertiary: var(--editorTheme3-more-tertiary, #ff3355); + --sa-block-field-background: var(--editorTheme3-more-field, #ff3355); +} + +.sa-block-color-pen { + --sa-block-background-primary: var(--editorTheme3-pen-primary, #0fbd8c); + --sa-block-background-secondary: var(--editorTheme3-pen-secondary, #0da57a); + --sa-block-background-tertiary: var(--editorTheme3-pen-tertiary, #0b8e69); + --sa-block-field-background: var(--editorTheme3-pen-field, #0b8e69); +} + +.sa-block-color-addon-custom-block { + --sa-block-background-primary: var(--editorTheme3-sa-primary, #29beb8); + --sa-block-background-secondary: var(--editorTheme3-sa-secondary, #3aa8a4); + --sa-block-background-tertiary: var(--editorTheme3-sa-tertiary, #3aa8a4); + --sa-block-field-background: var(--editorTheme3-sa-field, #3aa8a4); +} + +.sa-block-color-TurboWarp { + --sa-block-background-primary: var(--editorTheme3-tw-primary, #ff4c4c); + --sa-block-background-secondary: var(--editorTheme3-tw-secondary, #e64444); + --sa-block-background-tertiary: var(--editorTheme3-tw-tertiary, #e64444); + --sa-block-field-background: var(--editorTheme3-tw-field, #e64444); +} diff --git a/src/addons/addons/editor-theme3/forums/base.css b/src/addons/addons/editor-theme3/forums/base.css new file mode 100644 index 0000000000000000000000000000000000000000..5a41b6204ef3f24978250175ad3ef1ce99ad6b59 --- /dev/null +++ b/src/addons/addons/editor-theme3/forums/base.css @@ -0,0 +1,187 @@ +.sb-motion, +.sb-looks, +.sb-sound, +.sb-events, +.sb-control, +.sb-sensing, +.sb-operators, +.sb-variables, +.sb-list, +.sb-custom, +.sb-custom-arg, +.sb-extension, +.sb-pen { + fill: var(--sa-block-color); +} +.sb3-motion, +.sb3-looks, +.sb3-sound, +.sb3-events, +.sb3-control, +.sb3-sensing, +.sb3-operators, +.sb3-variables, +.sb3-list, +.sb3-custom, +.sb3-custom-arg, +.sb3-extension, +.sb3-pen { + fill: var(--sa-block-color); + stroke: rgba(0, 0, 0, 0.2); +} + +.sb3-motion-alt, +.sb3-looks-alt, +.sb3-sound-alt, +.sb3-events-alt, +.sb3-control-alt, +.sb3-sensing-alt, +.sb3-operators-alt, +.sb3-variables-alt, +.sb3-list-alt, +.sb3-custom-alt, +.sb3-custom-arg-alt, +.sb3-extension-alt, +.sb3-pen-alt { + fill: rgba(0, 0, 0, 0.1); + stroke: rgba(0, 0, 0, 0.1); +} +.sb3-motion-dark, +.sb3-looks-dark, +.sb3-sound-dark, +.sb3-events-dark, +.sb3-control-dark, +.sb3-sensing-dark, +.sb3-operators-dark, +.sb3-variables-dark, +.sb3-list-dark, +.sb3-custom-dark, +.sb3-custom-arg-dark, +.sb3-extension-dark, +.sb3-pen-dark { + fill: rgba(0, 0, 0, 0.2); +} +.sb3-extension-line { + stroke: rgba(0, 0, 0, 0.1); +} + +.sb-motion, +.sb-motion ~ .sb-label, +.sb3-motion, +.sb3-motion-dark, +.sb3-motion ~ .sb3-label { + --sa-block-color: var(--editorTheme3-motionColor); +} +.sb-looks, +.sb-looks ~ .sb-label, +.sb3-looks, +.sb3-looks-dark, +.sb3-looks ~ .sb3-label { + --sa-block-color: var(--editorTheme3-looksColor); +} +.sb-sound, +.sb-sound ~ .sb-label, +.sb3-sound, +.sb3-sound-dark, +.sb3-sound ~ .sb3-label { + --sa-block-color: var(--editorTheme3-soundsColor); +} +.sb-events, +.sb-events ~ .sb-label, +.sb3-events, +.sb3-events-dark, +.sb3-events ~ .sb3-label { + --sa-block-color: var(--editorTheme3-eventsColor); +} +.sb-control, +.sb-control ~ .sb-label, +.sb3-control, +.sb3-control-dark, +.sb3-control ~ .sb3-label { + --sa-block-color: var(--editorTheme3-controlColor); +} +.sb-sensing, +.sb-sensing ~ .sb-label, +.sb3-sensing, +.sb3-sensing-dark, +.sb3-sensing ~ .sb3-label { + --sa-block-color: var(--editorTheme3-sensingColor); +} +.sb-operators, +.sb-operators ~ .sb-label, +.sb3-operators, +.sb3-operators-dark, +.sb3-operators ~ .sb3-label { + --sa-block-color: var(--editorTheme3-operatorsColor); +} +.sb-variables, +.sb-variables ~ .sb-label, +.sb3-variables, +.sb3-variables-dark, +.sb3-variables ~ .sb3-label { + --sa-block-color: var(--editorTheme3-dataColor); +} +.sb-list, +.sb-list ~ .sb-label, +.sb3-list, +.sb3-list-dark, +.sb3-list ~ .sb3-label { + --sa-block-color: var(--editorTheme3-dataListsColor); +} +.sb-custom, +.sb-custom ~ .sb-label, +.sb3-custom, +.sb3-custom-dark, +.sb3-custom ~ .sb3-label, +.sb-custom-arg, +.sb-custom-arg ~ .sb-label, +.sb3-custom-arg, +.sb3-custom-arg-dark, +.sb3-custom-arg ~ .sb3-label { + --sa-block-color: var(--editorTheme3-customColor); +} +.sb-extension, +.sb-extension ~ .sb-label, +.sb3-extension, +.sb3-extension-dark, +.sb3-extension ~ .sb3-label, +.sb-pen, +.sb-pen ~ .sb-label, +.sb3-pen, +.sb3-pen-dark, +.sb3-pen ~ .sb3-label, +.sb3-extension-line { + --sa-block-color: var(--editorTheme3-PenColor); +} + +.sb-comment, +.sb3-comment, +.sb-comment-line, +.sb3-comment-line { + fill: var(--editorTheme3-commentColor); + stroke: var(--editorTheme3-commentBorder); +} +.sb-comment-label, +.sb3-comment-label { + fill: var(--editorTheme3-commentText); +} + +.sb-input-number, +.sb-input-number-dropdown, +.sb-input-string { + fill: var(--editorTheme3-inputColor); +} +.sb3-input-number, +.sb3-input-string { + fill: var(--editorTheme3-inputColor) !important; +} +.sb-label.sb-literal-number, +.sb-label.sb-literal-number-dropdown, +.sb-literal-number-dropdown + polygon /* dropdown arrow */, +.sb-label.sb-literal-string { + fill: var(--editorTheme3-inputColor-blackText); +} +.sb3-label.sb3-literal-number, +.sb3-label.sb3-literal-string { + fill: var(--editorTheme3-inputColor-text); +} diff --git a/src/addons/addons/editor-theme3/forums/black_text.css b/src/addons/addons/editor-theme3/forums/black_text.css new file mode 100644 index 0000000000000000000000000000000000000000..d6c94fbde1d571ad06398602ca42379761f8134a --- /dev/null +++ b/src/addons/addons/editor-theme3/forums/black_text.css @@ -0,0 +1,88 @@ +.sb3-motion, +.sb3-looks, +.sb3-sound, +.sb3-events, +.sb3-control, +.sb3-sensing, +.sb3-operators, +.sb3-variables, +.sb3-list, +.sb3-custom, +.sb3-custom-arg, +.sb3-extension, +.sb3-pen { + stroke: rgba(0, 0, 0, 0.35); +} + +.sb3-motion-alt, +.sb3-looks-alt, +.sb3-sound-alt, +.sb3-events-alt, +.sb3-control-alt, +.sb3-sensing-alt, +.sb3-operators-alt, +.sb3-variables-alt, +.sb3-list-alt, +.sb3-custom-alt, +.sb3-custom-arg-alt, +.sb3-extension-alt, +.sb3-pen-alt { + fill: rgba(255, 255, 255, 0.4); + stroke: rgba(0, 0, 0, 0.4); +} +.sb3-motion-dark, +.sb3-looks-dark, +.sb3-sound-dark, +.sb3-events-dark, +.sb3-control-dark, +.sb3-sensing-dark, +.sb3-operators-dark, +.sb3-variables-dark, +.sb3-list-dark, +.sb3-custom-dark, +.sb3-custom-arg-dark, +.sb3-extension-dark, +.sb3-pen-dark { + fill: rgba(0, 0, 0, 0.35); +} +.sb3-extension-line { + stroke: rgba(0, 0, 0, 0.35); +} + +.sb-motion ~ .sb-label, +.sb-looks ~ .sb-label, +.sb-sound ~ .sb-label, +.sb-events ~ .sb-label, +.sb-control ~ .sb-label, +.sb-sensing ~ .sb-label, +.sb-operators ~ .sb-label, +.sb-variables ~ .sb-label, +.sb-list ~ .sb-label, +.sb-custom ~ .sb-label, +.sb-custom-arg ~ .sb-label, +.sb-extension ~ .sb-label, +.sb-pen ~ .sb-label, +.sb3-motion ~ .sb3-label, +.sb3-looks ~ .sb3-label, +.sb3-sound ~ .sb3-label, +.sb3-events ~ .sb3-label, +.sb3-control ~ .sb3-label, +.sb3-sensing ~ .sb3-label, +.sb3-operators ~ .sb3-label, +.sb3-variables ~ .sb3-label, +.sb3-list ~ .sb3-label, +.sb3-custom ~ .sb3-label, +.sb3-custom-arg ~ .sb3-label, +.sb3-extension ~ .sb3-label, +.sb3-pen ~ .sb3-label, +#sb3-dropdownArrow path, +#sb3-loopArrow path[fill="#fff"], +#sb3-turnLeft path[fill="#fff"], +#sb3-turnRight path[fill="#fff"] { + fill: black; +} + +.sb3-label.sb3-literal-number, +.sb3-label.sb3-literal-string { + fill: var(--editorTheme3-inputColor-blackText); +} diff --git a/src/addons/addons/editor-theme3/forums/color_on_black.css b/src/addons/addons/editor-theme3/forums/color_on_black.css new file mode 100644 index 0000000000000000000000000000000000000000..0e2752203ffb4778b8ac82a6aed795bd67ac9f7b --- /dev/null +++ b/src/addons/addons/editor-theme3/forums/color_on_black.css @@ -0,0 +1,52 @@ +@import "%addon-self-dir%/forums/colored_text.css"; + +.sb-motion, +.sb-looks, +.sb-sound, +.sb-events, +.sb-control, +.sb-sensing, +.sb-operators, +.sb-variables, +.sb-list, +.sb-custom, +.sb-custom-arg, +.sb-extension, +.sb-pen, +.sb-grey, +.sb-obsolete, +.sb3-motion, +.sb3-looks, +.sb3-sound, +.sb3-events, +.sb3-control, +.sb3-sensing, +.sb3-operators, +.sb3-variables, +.sb3-list, +.sb3-custom, +.sb3-custom-arg, +.sb3-extension, +.sb3-pen, +.sb3-grey, +.sb3-obsolete { + fill: #282828; +} + +#bevelFilter feFlood[flood-color="#000"], +#inputBevelFilter feFlood[flood-color="#000"] { + flood-color: white; + flood-opacity: 0.05; +} + +.sb-comment, +.sb3-comment { + fill: #282828; + stroke: var(--editorTheme3-commentColor); +} + +.sb-label, +.sb3-label, +.sb-input-dropdown ~ polygon { + fill: white; +} diff --git a/src/addons/addons/editor-theme3/forums/color_on_white.css b/src/addons/addons/editor-theme3/forums/color_on_white.css new file mode 100644 index 0000000000000000000000000000000000000000..c19a0688a1f7499092a57bfa825f5a9b01cb8044 --- /dev/null +++ b/src/addons/addons/editor-theme3/forums/color_on_white.css @@ -0,0 +1,49 @@ +@import "%addon-self-dir%/forums/colored_text.css"; + +.sb-motion, +.sb-looks, +.sb-sound, +.sb-events, +.sb-control, +.sb-sensing, +.sb-operators, +.sb-variables, +.sb-list, +.sb-custom, +.sb-custom-arg, +.sb-extension, +.sb-pen, +.sb-grey, +.sb-obsolete, +.sb3-motion, +.sb3-looks, +.sb3-sound, +.sb3-events, +.sb3-control, +.sb3-sensing, +.sb3-operators, +.sb3-variables, +.sb3-list, +.sb3-custom, +.sb3-custom-arg, +.sb3-extension, +.sb3-pen, +.sb3-grey, +.sb3-obsolete { + fill: white; +} + +#bevelFilter feFlood[flood-color="#fff"], +#inputBevelFilter feFlood[flood-color="#fff"] { + flood-color: black; + flood-opacity: 0.3; +} + +.sb-comment, +.sb3-comment { + fill: white; + stroke: var(--editorTheme3-commentColor); +} +#sb3-dropdownArrow path { + fill: #575e75; +} diff --git a/src/addons/addons/editor-theme3/forums/colored_text.css b/src/addons/addons/editor-theme3/forums/colored_text.css new file mode 100644 index 0000000000000000000000000000000000000000..f93f9a6fcad59eef50a7766a724f58f372d2f909 --- /dev/null +++ b/src/addons/addons/editor-theme3/forums/colored_text.css @@ -0,0 +1,102 @@ +.sb3-motion, +.sb3-looks, +.sb3-sound, +.sb3-events, +.sb3-control, +.sb3-sensing, +.sb3-operators, +.sb3-variables, +.sb3-list, +.sb3-custom, +.sb3-custom-arg, +.sb3-extension, +.sb3-pen { + stroke: var(--sa-block-color); +} +.sb3-grey { + stroke: #949494; +} +.sb3-obsolete { + stroke: #ed4242; +} + +.sb-motion ~ .sb-label, +.sb-looks ~ .sb-label, +.sb-sound ~ .sb-label, +.sb-events ~ .sb-label, +.sb-control ~ .sb-label, +.sb-sensing ~ .sb-label, +.sb-operators ~ .sb-label, +.sb-variables ~ .sb-label, +.sb-list ~ .sb-label, +.sb-custom ~ .sb-label, +.sb-custom-arg ~ .sb-label, +.sb-extension ~ .sb-label, +.sb-pen ~ .sb-label, +.sb3-motion ~ .sb3-label, +.sb3-looks ~ .sb3-label, +.sb3-sound ~ .sb3-label, +.sb3-events ~ .sb3-label, +.sb3-control ~ .sb3-label, +.sb3-sensing ~ .sb3-label, +.sb3-operators ~ .sb3-label, +.sb3-variables ~ .sb3-label, +.sb3-list ~ .sb3-label, +.sb3-custom ~ .sb3-label, +.sb3-custom-arg ~ .sb3-label, +.sb3-extension ~ .sb3-label, +.sb3-pen ~ .sb3-label { + fill: var(--sa-block-color); +} +.sb-grey ~ .sb-label, +.sb3-grey ~ .sb3-label { + fill: #949494; +} +.sb-obsolete ~ .sb-label { + fill: #d42828; +} +.sb3-obsolete ~ .sb3-label { + fill: #ed4242; +} + +.sb-darker { + fill: var(--sa-block-color); + fill-opacity: 0.25; + filter: none; +} +.sb3-motion-alt, +.sb3-looks-alt, +.sb3-sound-alt, +.sb3-events-alt, +.sb3-control-alt, +.sb3-sensing-alt, +.sb3-operators-alt, +.sb3-variables-alt, +.sb3-list-alt, +.sb3-custom-alt, +.sb3-custom-arg-alt, +.sb3-extension-alt, +.sb3-pen-alt { + fill: var(--sa-block-color) !important; + fill-opacity: 0.15; +} +.sb3-motion-dark, +.sb3-looks-dark, +.sb3-sound-dark, +.sb3-events-dark, +.sb3-control-dark, +.sb3-sensing-dark, +.sb3-operators-dark, +.sb3-variables-dark, +.sb3-list-dark, +.sb3-custom-dark, +.sb3-custom-arg-dark, +.sb3-extension-dark, +.sb3-pen-dark { + fill: var(--sa-block-color); + fill-opacity: 0.25; +} +.sb3-extension-line { + stroke: var(--sa-block-color); + stroke-opacity: 0.15; +} diff --git a/src/addons/addons/editor-theme3/theme3.css b/src/addons/addons/editor-theme3/theme3.css new file mode 100644 index 0000000000000000000000000000000000000000..3c3070d141cfbeea1defd2557d0ac9f4caaa2d8b --- /dev/null +++ b/src/addons/addons/editor-theme3/theme3.css @@ -0,0 +1,31 @@ +.blocklyEditableText > text { + fill: var(--editorTheme3-inputColor-text); +} +.blocklyHtmlInput { + background-color: var(--editorTheme3-inputColor); + color: var(--editorTheme3-inputColor-text); +} + +.blocklyDropDownDiv .goog-menuitem-highlight, +.blocklyDropDownDiv .goog-menuitem-hover, +.sa-contextmenu-colored .blocklyContextMenu .goog-menuitem-highlight { + background-color: var(--editorTheme3-hoveredItem, rgba(0, 0, 0, 0.2)); +} + +.scratchCommentRect { + fill: var(--editorTheme3-commentColor); +} +.scratchCommentBody, +.scratchCommentTextarea { + background-color: var(--editorTheme3-commentColor); +} +.scratchWorkspaceCommentBorder { + stroke: var(--editorTheme3-commentBorder); +} +.scratchCommentTextarea::placeholder { + color: var(--editorTheme3-commentTextTransparent); +} +.scratchCommentText { + fill: var(--editorTheme3-commentText); + color: var(--editorTheme3-commentText); +} diff --git a/src/addons/addons/editor-theme3/theme3.js b/src/addons/addons/editor-theme3/theme3.js new file mode 100644 index 0000000000000000000000000000000000000000..a25943bc23c75066f50fd64f8a050bc952a1533c --- /dev/null +++ b/src/addons/addons/editor-theme3/theme3.js @@ -0,0 +1,366 @@ +import { + removeAlpha, + multiply, + brighten, + alphaBlend, + recolorFilter, +} from "../../libraries/common/cs/text-color.esm.js"; + +const dataUriRegex = new RegExp("^data:image/svg\\+xml;base64,([A-Za-z0-9+/=]*)$"); +const extensionsCategory = { + id: null, + settingId: "Pen-color", + colorId: "pen", +}; +const twCategory = { + id: null, + settingId: "tw-color", + colorId: "tw" +}; +const saCategory = { + settingId: "sa-color", + colorId: "sa", +}; +const categories = [ + { + id: "motion", + settingId: "motion-color", + colorId: "motion", + }, + { + id: "looks", + settingId: "looks-color", + colorId: "looks", + }, + { + id: "sound", + settingId: "sounds-color", + colorId: "sounds", + }, + { + id: "events", + settingId: "events-color", + colorId: "event", + }, + { + id: "control", + settingId: "control-color", + colorId: "control", + }, + { + id: "sensing", + settingId: "sensing-color", + colorId: "sensing", + }, + { + id: "operators", + settingId: "operators-color", + colorId: "operators", + }, + { + id: "variables", + settingId: "data-color", + colorId: "data", + }, + { + id: "lists", + settingId: "data-lists-color", + colorId: "data_lists", + }, + { + id: "myBlocks", + settingId: "custom-color", + colorId: "more", + }, + extensionsCategory, + twCategory, + saCategory, +]; + +export default async function ({ addon, console }) { + const Blockly = await addon.tab.traps.getBlockly(); + + const originalColors = JSON.parse(JSON.stringify(Blockly.Colours)); + originalColors.sa = { + primary: "#29beb8", + secondary: "#3aa8a4", + tertiary: "#3aa8a4", + }; + originalColors.tw = { + primary: "#ff4c4c", + secondary: "#e64444", + tertiary: "#e64444" + }; + + let textModeSetting = addon.settings.get("text"); + const textMode = () => (addon.self.disabled ? "white" : textModeSetting); + const isColoredTextMode = () => textMode() === "colorOnWhite" || textMode() === "colorOnBlack"; + + const primaryColor = (category) => { + if (addon.self.disabled) return originalColors[category.colorId].primary; + // Colored on white: can't use #ffffff because of editor-dark-mode dropdown div handling + if (textMode() === "colorOnWhite") return "#feffff"; + if (textMode() === "colorOnBlack") return "#282828"; + return addon.settings.get(category.settingId); + }; + const secondaryColor = (category) => { + if (addon.self.disabled) return originalColors[category.colorId].secondary; + if (isColoredTextMode()) + return alphaBlend(primaryColor(category), multiply(addon.settings.get(category.settingId), { a: 0.15 })); + if (textMode() === "black") return brighten(addon.settings.get(category.settingId), { r: 0.6, g: 0.6, b: 0.6 }); + return multiply(addon.settings.get(category.settingId), { r: 0.9, g: 0.9, b: 0.9 }); + }; + const tertiaryColor = (category) => { + if (addon.self.disabled) return originalColors[category.colorId].tertiary; + if (isColoredTextMode()) return addon.settings.get(category.settingId); + if (textMode() === "black") return multiply(addon.settings.get(category.settingId), { r: 0.65, g: 0.65, b: 0.65 }); + return multiply(addon.settings.get(category.settingId), { r: 0.8, g: 0.8, b: 0.8 }); + }; + const fieldBackground = (category) => { + // Background color for open dropdowns and (in some textModes) Boolean inputs + // The argument can be a block, field, or category + if (category instanceof Blockly.Block || category instanceof Blockly.Field) { + const block = category instanceof Blockly.Block ? category : category.sourceBlock_; + if (isColoredTextMode() || textMode() === "black") { + let primary; + if (block.isShadow() && block.getParent()) primary = block.getParent().getColour(); + else primary = block.getColour(); + if (isColoredTextMode()) return alphaBlend(primary, multiply(block.getColourTertiary(), { a: 0.25 })); + else return brighten(primary, { r: 0.4, g: 0.4, b: 0.4 }); + } + return block.getColourTertiary(); + } + if (isColoredTextMode()) + return alphaBlend(primaryColor(category), multiply(addon.settings.get(category.settingId), { a: 0.25 })); + if (textMode() === "black") return brighten(primaryColor(category), { r: 0.4, g: 0.4, b: 0.4 }); + return tertiaryColor(category); + }; + const textColor = (field) => { + if (addon.self.disabled || textMode() === "white") return "#ffffff"; + if (textMode() === "black") return "#000000"; + if (field) return field.sourceBlock_.getColourTertiary(); + return "#000000"; + }; + const uncoloredTextColor = () => { + if (addon.self.disabled) return "#ffffff"; + return { + white: "#ffffff", + black: "#575e75", + colorOnWhite: "#575e75", + colorOnBlack: "#ffffff", + }[textMode]; + }; + const otherColor = (settingId, colorId) => { + if (addon.self.disabled) return originalColors[colorId]; + return addon.settings.get(settingId); + }; + + // Blockly doesn't handle colors with transparency + const oldBlockMakeColor = Blockly.Block.prototype.makeColour_; + Blockly.Block.prototype.makeColour_ = function (color) { + if (typeof color === "string" && /^#(?:[0-9A-Za-z]{2}){3,4}$/.test(color)) return color; + return oldBlockMakeColor(color); + }; + + const oldCategoryCreateDom = Blockly.Toolbox.Category.prototype.createDom; + Blockly.Toolbox.Category.prototype.createDom = function () { + // Category bubbles + if (this.iconURI_) { + if (addon.self.disabled) return oldCategoryCreateDom.call(this); + if (!["sa-blocks", "videoSensing", "text2speech"].includes(this.id_)) return oldCategoryCreateDom.call(this); + + const match = dataUriRegex.exec(this.iconURI_); + if (match) { + const oldSvg = atob(match[1]); + const category = this.id_ === "sa-blocks" ? saCategory : extensionsCategory; + const newColor = isColoredTextMode ? tertiaryColor(category) : primaryColor(category); + if (newColor) { + const newSvg = oldSvg.replace(/#29beb8|#0ebd8c/gi, newColor); + this.iconURI_ = `data:image/svg+xml;base64,${btoa(newSvg)}`; + } + } + } + oldCategoryCreateDom.call(this); + if (this.iconURI_) return; + const category = categories.find((item) => item.id === this.id_); + if (!category) return; + this.bubble_.style.backgroundColor = isColoredTextMode() ? fieldBackground(category) : primaryColor(category); + this.bubble_.style.borderColor = tertiaryColor(category); + }; + + const oldBlockSetColour = Blockly.Block.prototype.setColour; + Blockly.Block.prototype.setColour = function (colour, colourSecondary, colourTertiary) { + // Extension blocks (color is set by VM) + if (colour.toLowerCase() === originalColors.pen.primary.toLowerCase()) { + colour = primaryColor(extensionsCategory); + colourSecondary = secondaryColor(extensionsCategory); + colourTertiary = tertiaryColor(extensionsCategory); + } + // TurboWarp Blocks + if (this.type.startsWith("tw_")) { + colour = primaryColor(twCategory); + colourSecondary = secondaryColor(twCategory); + colourTertiary = tertiaryColor(twCategory); + } + return oldBlockSetColour.call(this, colour, colourSecondary, colourTertiary); + }; + + const oldBlockUpdateColour = Blockly.BlockSvg.prototype.updateColour; + Blockly.BlockSvg.prototype.updateColour = function () { + oldBlockUpdateColour.call(this); + // Boolean inputs + if (isColoredTextMode()) { + for (const input of this.inputList) { + if (input.outlinePath) { + input.outlinePath.setAttribute("fill", fieldBackground(this)); + } + } + } + }; + + const oldBlockShowContextMenu = Blockly.BlockSvg.prototype.showContextMenu_; + Blockly.BlockSvg.prototype.showContextMenu_ = function (e) { + Blockly.WidgetDiv.DIV.style.setProperty("--editorTheme3-hoveredItem", fieldBackground(this)); + return oldBlockShowContextMenu.call(this, e); + }; + + const oldFieldLabelInit = Blockly.FieldLabel.prototype.init; + Blockly.FieldLabel.prototype.init = function () { + // Labels + oldFieldLabelInit.call(this); + this.textElement_.style.fill = textColor(this); + }; + + const oldFieldTextInputInit = Blockly.FieldTextInput.prototype.init; + Blockly.FieldTextInput.prototype.init = function () { + // Text inputs + oldFieldTextInputInit.call(this); + if (this.sourceBlock_.isShadow()) return; + // Labels in custom block editor + this.box_.setAttribute("fill", fieldBackground(this)); + }; + + const oldFieldDropdownInit = Blockly.FieldDropdown.prototype.init; + Blockly.FieldDropdown.prototype.init = function () { + // Dropdowns + oldFieldDropdownInit.call(this); + this.textElement_.style.setProperty("fill", textColor(this), "important"); + if (textColor(this) !== "#ffffff") this.arrow_.style.filter = recolorFilter(textColor(this)); + }; + + const oldFieldDropdownShowEditor = Blockly.FieldDropdown.prototype.showEditor_; + Blockly.FieldDropdown.prototype.showEditor_ = function () { + oldFieldDropdownShowEditor.call(this); + + // Open dropdowns + if (!this.disableColourChange_) { + if (this.sourceBlock_.isShadow()) { + this.sourceBlock_.setShadowColour(fieldBackground(this)); + } else if (this.box_) { + this.box_.setAttribute("fill", fieldBackground(this)); + } + } + + // Dropdown menus + let primaryColor; + if (this.sourceBlock_.isShadow() && this.sourceBlock_.getParent()) + primaryColor = this.sourceBlock_.getParent().getColour(); + else primaryColor = this.sourceBlock_.getColour(); + Blockly.DropDownDiv.DIV_.style.backgroundColor = removeAlpha(primaryColor); + if (isColoredTextMode()) { + Blockly.DropDownDiv.getContentDiv().style.setProperty("--editorTheme3-hoveredItem", fieldBackground(this)); + } else { + Blockly.DropDownDiv.getContentDiv().style.removeProperty("--editorTheme3-hoveredItem"); + } + }; + + const oldFieldVariableInit = Blockly.FieldVariable.prototype.init; + Blockly.FieldVariable.prototype.init = function () { + // Variable dropdowns + oldFieldVariableInit.call(this); + this.textElement_.style.setProperty("fill", textColor(this), "important"); + }; + + const oldFieldVariableGetterInit = Blockly.FieldVariableGetter.prototype.init; + Blockly.FieldVariableGetter.prototype.init = function () { + // Variable reporters + oldFieldVariableGetterInit.call(this); + this.textElement_.style.fill = textColor(this); + }; + + const oldFieldMatrixUpdateMatrix = Blockly.FieldMatrix.prototype.updateMatrix_; + Blockly.FieldMatrix.prototype.updateMatrix_ = function () { + // Matrix inputs + oldFieldMatrixUpdateMatrix.call(this); + for (let i = 0; i < this.matrix_.length; i++) { + if (this.matrix_[i] !== "0") { + this.fillMatrixNode_(this.ledButtons_, i, uncoloredTextColor()); + this.fillMatrixNode_(this.ledThumbNodes_, i, uncoloredTextColor()); + } + } + }; + + const oldFieldMatrixCreateButton = Blockly.FieldMatrix.prototype.createButton_; + Blockly.FieldMatrix.prototype.createButton_ = function (fill) { + if (fill === "#FFFFFF") fill = uncoloredTextColor(); + return oldFieldMatrixCreateButton.call(this, fill); + }; + + const oldFieldVerticalSeparatorInit = Blockly.FieldVerticalSeparator.prototype.init; + Blockly.FieldVerticalSeparator.prototype.init = function () { + // Vertical line between extension icon and block label + oldFieldVerticalSeparatorInit.call(this); + if (textMode() === "black") this.lineElement_.setAttribute("stroke", this.sourceBlock_.getColourTertiary()); + }; + + const updateColors = () => { + const vm = addon.tab.traps.vm; + + textModeSetting = addon.settings.get("text"); + + for (const category of categories) { + // CSS variables are used for compatibility with other addons + const prefix = `--editorTheme3-${category.colorId}`; + for (const [name, value] of Object.entries({ + primary: primaryColor(category), + secondary: secondaryColor(category), + tertiary: tertiaryColor(category), + field: fieldBackground(category), + })) { + document.documentElement.style.setProperty(`${prefix}-${name}`, value); + } + + // Update Blockly.Colours + if (!Blockly.Colours[category.colorId]) continue; + Blockly.Colours[category.colorId].primary = primaryColor(category); + Blockly.Colours[category.colorId].secondary = secondaryColor(category); + Blockly.Colours[category.colorId].tertiary = tertiaryColor(category); + } + addon.tab.setCustomBlockColor({ + color: primaryColor(saCategory), + secondaryColor: secondaryColor(saCategory), + tertiaryColor: tertiaryColor(saCategory), + }); + Blockly.Colours.textField = otherColor("input-color", "textField"); + if (uncoloredTextColor() === "#575e75") Blockly.Colours.fieldShadow = "rgba(0, 0, 0, 0.15)"; + else Blockly.Colours.fieldShadow = originalColors.fieldShadow; + + const workspace = Blockly.getMainWorkspace(); + const flyout = workspace.getFlyout(); + const toolbox = workspace.getToolbox(); + + // Reload toolbox + if (vm.editingTarget) { + vm.emitWorkspaceUpdate(); + } + const flyoutWorkspace = flyout.getWorkspace(); + Blockly.Xml.clearWorkspaceAndLoadFromXml(Blockly.Xml.workspaceToDom(flyoutWorkspace), flyoutWorkspace); + toolbox.populate_(workspace.options.languageTree); + workspace.toolboxRefreshEnabled_ = true; + }; + + updateColors(); + addon.settings.addEventListener("change", updateColors); + addon.self.addEventListener("disabled", updateColors); + addon.self.addEventListener("reenabled", updateColors); +} diff --git a/src/addons/addons/find-bar/_manifest_entry.js b/src/addons/addons/find-bar/_manifest_entry.js new file mode 100644 index 0000000000000000000000000000000000000000..54182693045f0a852e3225ec3fdd55b9229d0a04 --- /dev/null +++ b/src/addons/addons/find-bar/_manifest_entry.js @@ -0,0 +1,37 @@ +/* generated by pull.js */ +const manifest = { + "editorOnly": true, + "name": "Editor find bar", + "description": "Adds a find bar to find and jump to scripts, costumes and sounds next to the sounds tab. Use Ctrl+Left and Ctrl+Right in the code area to navigate to previous or next visited position after using the find bar.", + "info": [ + { + "text": "This addon was previously part of the \"developer tools\" addon but has moved here.", + "id": "developer-tools" + } + ], + "credits": [ + { + "name": "griffpatch" + }, + { + "name": "TheColaber", + "link": "https://scratch.mit.edu/users/thecolaber/" + } + ], + "dynamicDisable": true, + "userscripts": [ + { + "url": "userscript.js" + } + ], + "userstyles": [ + { + "url": "userstyle.css" + } + ], + "tags": [ + "recommended" + ], + "enabledByDefault": true +}; +export default manifest; diff --git a/src/addons/addons/find-bar/_runtime_entry.js b/src/addons/addons/find-bar/_runtime_entry.js new file mode 100644 index 0000000000000000000000000000000000000000..e8d1f9d053dfbf3603b17200d244fda9ead99731 --- /dev/null +++ b/src/addons/addons/find-bar/_runtime_entry.js @@ -0,0 +1,7 @@ +/* generated by pull.js */ +import _js from "./userscript.js"; +import _css from "!css-loader!./userstyle.css"; +export const resources = { + "userscript.js": _js, + "userstyle.css": _css, +}; diff --git a/src/addons/addons/find-bar/blockly/BlockFlasher.js b/src/addons/addons/find-bar/blockly/BlockFlasher.js new file mode 100644 index 0000000000000000000000000000000000000000..160fe030cae9e129859aec96c8d2ef059eaa12cc --- /dev/null +++ b/src/addons/addons/find-bar/blockly/BlockFlasher.js @@ -0,0 +1,43 @@ +/** + * Helper class to flash a Blockly scratch block in the users workspace + */ +export default class BlockFlasher { + /** + * FLash a block 3 times + * @param block the block to flash + */ + static flash(block) { + if (myFlash.timerID > 0) { + clearTimeout(myFlash.timerID); + if (myFlash.block.svgPath_) { + myFlash.block.svgPath_.style.fill = ""; + } + } + + let count = 4; + let flashOn = true; + myFlash.block = block; + + /** + * Internal method to switch the colour of a block between light yellow and it's original colour + * @private + */ + function _flash() { + if (myFlash.block.svgPath_) { + myFlash.block.svgPath_.style.fill = flashOn ? "#ffff80" : ""; + } + flashOn = !flashOn; + count--; + if (count > 0) { + myFlash.timerID = setTimeout(_flash, 200); + } else { + myFlash.timerID = 0; + myFlash.block = null; + } + } + + _flash(); + } +} + +const myFlash = { block: null, timerID: null }; diff --git a/src/addons/addons/find-bar/blockly/BlockInstance.js b/src/addons/addons/find-bar/blockly/BlockInstance.js new file mode 100644 index 0000000000000000000000000000000000000000..5ade803fc732ce8d2308acd9cbfa51ee22399919 --- /dev/null +++ b/src/addons/addons/find-bar/blockly/BlockInstance.js @@ -0,0 +1,9 @@ +/** + * Encapsulates a block (either in this sprite or another / Blockly, or native JSON block + */ +export default class BlockInstance { + constructor(target, block) { + this.targetId = target.id; + this.id = block.id; + } +} diff --git a/src/addons/addons/find-bar/blockly/BlockItem.js b/src/addons/addons/find-bar/blockly/BlockItem.js new file mode 100644 index 0000000000000000000000000000000000000000..37520202704179036ca07741c897c16798916ce3 --- /dev/null +++ b/src/addons/addons/find-bar/blockly/BlockItem.js @@ -0,0 +1,34 @@ +export default class BlockItem { + constructor(cls, procCode, labelID, y) { + this.cls = cls; + this.procCode = procCode; + this.labelID = labelID; + this.y = y; + this.lower = procCode.toLowerCase(); + /** + * An Array of block ids + * @type {Array.} + */ + this.clones = null; + this.eventName = null; + } + + /** + * True if the blockID matches a black represented by this BlockItem + * @param id + * @returns {boolean} + */ + matchesID(id) { + if (this.labelID === id) { + return true; + } + if (this.clones) { + for (const cloneID of this.clones) { + if (cloneID === id) { + return true; + } + } + } + return false; + } +} diff --git a/src/addons/addons/find-bar/blockly/Utils.js b/src/addons/addons/find-bar/blockly/Utils.js new file mode 100644 index 0000000000000000000000000000000000000000..8b6873f9f4645d2e60ac17568969f9f4af70a77b --- /dev/null +++ b/src/addons/addons/find-bar/blockly/Utils.js @@ -0,0 +1,214 @@ +import BlockInstance from "./BlockInstance.js"; +import BlockFlasher from "./BlockFlasher.js"; + +// Make these global so that every addon uses the same arrays. +let views = []; +let forward = []; +export default class Utils { + constructor(addon) { + this.addon = addon; + this.addon.tab.traps.getBlockly().then((blockly) => { + this.blockly = blockly; + }); + /** + * Scratch Virtual Machine + * @type {null|*} + */ + this.vm = this.addon.tab.traps.vm; + // this._myFlash = { block: null, timerID: null, colour: null }; + this.offsetX = 32; + this.offsetY = 32; + this.navigationHistory = new NavigationHistory(); + /** + * The workspace + */ + this._workspace = null; + } + + /** + * Get the Scratch Editing Target + * @returns {?Target} the scratch editing target + */ + getEditingTarget() { + return this.vm.runtime.getEditingTarget(); + } + + /** + * Set the current workspace (switches sprites) + * @param targetID {string} + */ + setEditingTarget(targetID) { + if (this.getEditingTarget().id !== targetID) { + this.vm.setEditingTarget(targetID); + } + } + + /** + * Returns the main workspace + * @returns !Blockly.Workspace + */ + getWorkspace() { + const currentWorkspace = Blockly.getMainWorkspace(); + if (currentWorkspace.getToolbox()) { + // Sadly get get workspace does not always return the 'real' workspace... Not sure how to get that at the moment, + // but we can work out whether it's the right one by whether it has a toolbox. + this._workspace = currentWorkspace; + } + return this._workspace; + } + + /** + * Based on wksp.centerOnBlock(li.data.labelID); + * @param blockOrId {Blockly.Block|{id}|BlockInstance} A Blockly Block, a block id, or a BlockInstance + */ + scrollBlockIntoView(blockOrId) { + let workspace = this.getWorkspace(); + /** @type {Blockly.Block} */ + let block; // or is it really a Blockly.BlockSvg? + + if (blockOrId instanceof BlockInstance) { + // Switch to sprite + this.setEditingTarget(blockOrId.targetId); + // Highlight the block! + block = workspace.getBlockById(blockOrId.id); + } else { + block = blockOrId && blockOrId.id ? blockOrId : workspace.getBlockById(blockOrId); + } + + if (!block) { + return; + } + + /** + * !Blockly.Block + */ + let root = block.getRootBlock(); + let base = this.getTopOfStackFor(block); + let ePos = base.getRelativeToSurfaceXY(), // Align with the top of the block + rPos = root.getRelativeToSurfaceXY(), // Align with the left of the block 'stack' + scale = workspace.scale, + x = rPos.x * scale, + y = ePos.y * scale, + xx = block.width + x, // Turns out they have their x & y stored locally, and they are the actual size rather than scaled or including children... + yy = block.height + y, + s = workspace.getMetrics(); + if ( + x < s.viewLeft + this.offsetX - 4 || + xx > s.viewLeft + s.viewWidth || + y < s.viewTop + this.offsetY - 4 || + yy > s.viewTop + s.viewHeight + ) { + // sx = s.contentLeft + s.viewWidth / 2 - x, + let sx = x - s.contentLeft - this.offsetX, + // sy = s.contentTop - y + Math.max(Math.min(32, 32 * scale), (s.viewHeight - yh) / 2); + sy = y - s.contentTop - this.offsetY; + + this.navigationHistory.storeView(this.navigationHistory.peek(), 64); + + // workspace.hideChaff(), + workspace.scrollbar.set(sx, sy); + this.navigationHistory.storeView({ left: sx, top: sy }, 64); + } + this.blockly?.hideChaff(); + BlockFlasher.flash(block); + } + + /** + * Find the top stack block of a stack + * @param block a block in a stack + * @returns {*} a block that is the top of the stack of blocks + */ + getTopOfStackFor(block) { + let base = block; + while (base.getOutputShape() && base.getSurroundParent()) { + base = base.getSurroundParent(); + } + return base; + } +} + +class NavigationHistory { + /** + * Keep a record of the scroll and zoom position + */ + storeView(next, dist) { + forward = []; + let workspace = Blockly.getMainWorkspace(), + s = workspace.getMetrics(); + + let pos = { left: s.viewLeft, top: s.viewTop }; + if (!next || distance(pos, next) > dist) { + views.push(pos); + } + } + + peek() { + return views.length > 0 ? views[views.length - 1] : null; + } + + goBack() { + const workspace = Blockly.getMainWorkspace(), + s = workspace.getMetrics(); + + let pos = { left: s.viewLeft, top: s.viewTop }; + let view = this.peek(); + if (!view) { + return; + } + if (distance(pos, view) < 64) { + // Go back to current if we are already far away from it + if (views.length > 1) { + views.pop(); + forward.push(view); + } + } + + view = this.peek(); + if (!view) { + return; + } + + let sx = view.left - s.contentLeft, + sy = view.top - s.contentTop; + + // transform.setTranslate(-600,0); + + workspace.scrollbar.set(sx, sy); + + /* + let blocklySvg = document.getElementsByClassName('blocklySvg')[0]; + let blocklyBlockCanvas = blocklySvg.getElementsByClassName('blocklyBlockCanvas')[0]; + let transform = blocklyBlockCanvas.transform.baseVal.getItem(0); + let scale = blocklyBlockCanvas.transform.baseVal.getItem(1); + + let transformMatrix = transform.matrix; + let scaleMatrix = scale.matrix; + + console.log('Transform - getMetrics', s); + console.log('sx, sy: ', sx, sy); + console.log('left, top: ', view.left, view.top); + console.log('contentLeft, right:', s.contentLeft, s.contentTop); + console.log('transform, scale matrix: ', transformMatrix, scaleMatrix); + */ + } + + goForward() { + let view = forward.pop(); + if (!view) { + return; + } + views.push(view); + + let workspace = Blockly.getMainWorkspace(), + s = workspace.getMetrics(); + + let sx = view.left - s.contentLeft, + sy = view.top - s.contentTop; + + workspace.scrollbar.set(sx, sy); + } +} + +function distance(pos, next) { + return Math.sqrt(Math.pow(pos.left - next.left, 2) + Math.pow(pos.top - next.top, 2)); +} diff --git a/src/addons/addons/find-bar/userscript.js b/src/addons/addons/find-bar/userscript.js new file mode 100644 index 0000000000000000000000000000000000000000..174bbc2036341da646d1493658d8cf41993b5ae0 --- /dev/null +++ b/src/addons/addons/find-bar/userscript.js @@ -0,0 +1,828 @@ +import BlockItem from "./blockly/BlockItem.js"; +import BlockInstance from "./blockly/BlockInstance.js"; +import Utils from "./blockly/Utils.js"; + +export default async function ({ addon, msg, console }) { + const Blockly = await addon.tab.traps.getBlockly(); + + class FindBar { + constructor() { + this.utils = new Utils(addon); + + this.prevValue = ""; + + this.findBarOuter = null; + this.findWrapper = null; + this.findInput = null; + this.dropdownOut = null; + this.dropdown = new Dropdown(this.utils); + + document.addEventListener("keydown", (e) => this.eventKeyDown(e), true); + } + + get workspace() { + return Blockly.getMainWorkspace(); + } + + createDom(root) { + this.findBarOuter = document.createElement("div"); + this.findBarOuter.className = "sa-find-bar"; + addon.tab.displayNoneWhileDisabled(this.findBarOuter, { display: "flex" }); + root.appendChild(this.findBarOuter); + + this.findWrapper = this.findBarOuter.appendChild(document.createElement("span")); + this.findWrapper.className = "sa-find-wrapper"; + + this.dropdownOut = this.findWrapper.appendChild(document.createElement("label")); + this.dropdownOut.className = "sa-find-dropdown-out"; + + this.findInput = this.dropdownOut.appendChild(document.createElement("input")); + this.findInput.className = addon.tab.scratchClass("input_input-form", { + others: "sa-find-input", + }); + // for